gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:16:00 26 4
gpt4 key购买 nike

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

我在我试图 LIMIT 的大量删除查询中使用它并且它有效,同时速度也非常快。

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,则该项为真。因此,1000 行中大约有 1 行是随机的。这些将是它将删除的行。而 1000 行中的其他 999 行将跳过删除。

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

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

否则 AND 的绑定(bind)比 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/45656145/

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