gpt4 book ai didi

mysql - RAND() 在 MYSQL 的 WHERE 子句中

转载 作者:行者123 更新时间:2023-11-29 16:44:33 25 4
gpt4 key购买 nike

我发现这篇博客文章展示了一种从表中抓取随机行的方法: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

最佳答案

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

每次表达式调用 RAND() 时,该函数都会返回 0 到 1 之间的不同随机浮点值。如果该随机值等于或小于 0.001,则该项为 true。因此,大约 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 行将被删除,包括一些类型不是 ' 的行快照'。

这可能不是您想要的。您应该回顾 bool 代数和运算符优先级。请参阅https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html

关于mysql - RAND() 在 MYSQL 的 WHERE 子句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53164132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com