RAND()在MYSQL的WHERE子句中教程
我发现此博客文章显示了一种从表中获取随机行的方法: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);
这意味着将删除所有类型为“ Snapshot”且id = 113的行,而将删除1/1000行的parent\_id = 113的行,包括某些类型为“ Snapshot”以外的行.
那可能不是您想要的.您应该查看布尔代数和运算符优先级.查看https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html