2017-08-13 64 views
1

條款我發現這個博客帖子裏介紹的方式攫取從表中隨機行:http://www.rndblog.com/how-to-select-random-rows-in-mysql/RAND()在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.S.我正在使用MYSQL 5.5

回答

4

您的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); 

這意味着,與類型=「快照」和ID 所有行= 113將被刪除,而1/1000行與PARENT_ID = 113將被刪除,其中包括一些r除了「快照」以外的其他類型。

這可能不是你想要的。您應該查看布爾代數和運算符優先級。見https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html