RAND() 在 MYSQL 的 WHERE 子句中

Posted

技术标签:

【中文标题】RAND() 在 MYSQL 的 WHERE 子句中【英文标题】:RAND() In WHERE clause in MYSQL 【发布时间】:2017-08-13 00:47:35 【问题描述】:

我发现这篇博客文章展示了一种从表中获取随机行的方法:http://www.rndblog.com/how-to-select-random-rows-in-mysql/

我在尝试限制的大量删除查询中使用了它,它有效,同时速度也非常快。

DELETE table1 FROM table1 
    JOIN table2 ON table2.id = table1.salesperson_id 
    JOIN table3 ON table3.id = table2.user_id
    JOIN table4 ON table3.office_id = table4.id
WHERE table1.type = "Snapshot" 
    AND table4.id = 113 OR table4.parent_id =113
    AND RAND()<=0.001;

我不明白这是如何工作的。我尝试了广泛的谷歌搜索,但我没有发现以这种方式使用的 WHERE 子句中的 RAND() 。 文档也没有对此提供任何信息。

提前谢谢你。

附:我正在使用 MYSQL 5.5

【问题讨论】:

【参考方案1】:

WHERE 子句中的表达式会针对连接生成的每一行进行评估。

每次表达式调用 RAND() 时,该函数都会返回一个介于 0 和 1 之间的不同随机浮点值。如果该随机值等于或小于 0.001,则该项为真。因此,大约 1000 行中的 1 行是随机的。这些将是它将删除的行。而 1000 行中的其他 999 行将跳过删除。

顺便说一句,我猜你希望 WHERE 子句有一些括号来强制运算符优先级:

WHERE table1.type = "Snapshot" 
    AND (table4.id = 113 OR table4.parent_id = 113)
    AND RAND()<=0.001;

否则 AND 的绑定比 OR 更强,因此没有这些括号,表达式将像您这样写一样工作:

WHERE (table1.type = "Snapshot" 
    AND table4.id = 113) OR (table4.parent_id =113
    AND RAND()<=0.001);

这意味着 所有 type='Snapshot' AND id=113 的行将被删除,而 parent_id=113 的 1/1000 行将被删除,包括一些非 ' 类型的行快照”。

这可能不是你想要的。您应该查看布尔代数和运算符优先级。见https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html

【讨论】:

【参考方案2】:

这是在 mySQL 中使用带有 RAND 的 WHERE 子句的示例:

SELECT * FROM t1
WHERE status = 1
ORDER BY RAND() LIMIT 2;

【讨论】:

以上是关于RAND() 在 MYSQL 的 WHERE 子句中的主要内容,如果未能解决你的问题,请参考以下文章

在 where 子句和 order by 子句之间的 MySQL 索引

如何在 WHERE 子句(MySQL)中使用 VIEW?

MySQL - 在 WHERE 子句中使用 COUNT(*)

在mysql select语句中使用条件where子句

Mysql在where子句中优化子查询

Hibernate @Where 子句在 HSQL 和 MySQL 之间不一致