RAND()在MYSQL

时间:2017-08-13 00:47:36

标签: mysql random

我发现此博客帖子显示了从表格中抓取随机行的方法: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()。 文档也没有提供任何相关内容。

提前谢谢你。

P.S。我正在使用MYSQL 5.5

2 个答案:

答案 0 :(得分: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比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行,包括某些类型不是'的行快照”。

这可能不是你想要的。您应该检查布尔代数和运算符优先级。见https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html

答案 1 :(得分:0)

这是在mySQL中将子句WHERE与RAND一起使用的示例:

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