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 索引