rand()

cnh2zyt3  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(351)

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

我不明白这是怎么回事。我尝试了大量的google搜索,但是在where子句中找不到以这种方式使用的rand()。医生也没有透露。
先谢谢你。
p、 我正在使用MySQL5.5

fzsnzjdm

fzsnzjdm1#

这是一个在mysql中使用where with rand子句的示例:

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

6tr1vspr2#

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;

否则,并且绑定比或更强烈,因此如果没有这些括号,表达式的工作方式将与您这样编写的一样:

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

这意味着类型为“snapshot”且id=113的所有行都将被删除,而父级id=113的1/1000行将被删除,包括一些类型不是“snapshot”的行。
那可能不是你想要的。您应该复习布尔代数和运算符优先级。看到了吗https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html

相关问题