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

标签: mysql, random

相关文章推荐

添加新评论,含*的栏目为必填