我发现这篇博文显示了一种从表中获取随机行的方法: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;
Run Code Online (Sandbox Code Playgroud)
我不明白这是如何工作的.我尝试了广泛的谷歌搜索,但我没有发现WHERE子句中以这种方式使用的RAND().文档也没有提供任何相关内容.
先感谢您.
PS我正在使用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;
Run Code Online (Sandbox Code Playgroud)
否则,AND的绑定比OR更强,所以没有这些括号,表达式就像你用这样写的方式一样:
WHERE (table1.type = "Snapshot"
AND table4.id = 113) OR (table4.parent_id =113
AND RAND()<=0.001);
Run Code Online (Sandbox Code Playgroud)
这意味着将删除type ='Snapshot'AND id = 113的所有行,而删除parent_id = 113的1/1000行,包括一些类型不是'Snapshot'的行.
这可能不是你想要的.您应该检查布尔代数和运算符优先级.请参阅https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |