mysql 在數據表中隨機取數據或隨機排序


最近遇到一個需求,就是隨機取數據,本着拿來主義的精神,網上找了找,基本上都是這個下面這個內容,但是並不能讓人滿意:


1、select * from users order by rand() LIMIT 1


2、SELECT * FROM users  AS t1  JOIN (SELECT ROUND(RAND() * ((SELECT MAX(userId) FROM `users`)-(SELECT MIN(userId) FROM users))+(SELECT MIN(userId) FROM users)) AS userId) AS t2 WHERE t1.userId >= t2.userId ORDER BY t1.userId LIMIT 1


3、SELECT * FROM users WHERE userId >= ((SELECT MAX(userId) FROM users)-(SELECT MIN(userId) FROM users)) * RAND() + (SELECT MIN(userId) FROM users)  LIMIT 1


先說一下,感覺三個雖然能滿足需求,但是並不完善,而且感覺上怪怪的


下面給大家說下我自己改良編號2的sql語句:


SELECT t1.* FROM table AS t1 JOIN (SELECT id,(rand()*timestamp(now())) AS rid from table where 過濾條件) as t2 where t2.id=v1.id order by v2.rid 


性能:百條數據的查詢速度在 0.0015s 以內

思路:先查詢出需要的內容(即JOIN ()內的語句,當然我們只是需要一個隨機字段rid),然後t2.id=t1.id來取到數據


---------------------------------------時間分割線-------------------------------------


還沒完,就在剛纔寫這個的時候突然想到自己是不是傻,完全可以更簡單的,那就是這樣:


SELECT *,(rand()*timestamp(now())) AS rid FROM table [where 過濾條件] ORDER BY rid DESC|ASC


完全沒必要在和自身去內聯

性能方面絕對沒得說,最基本的查詢語句只不過多生成了一個隨機字段(不過如果一定不要這個隨機字段的話還是用上面的吧),然後order by這個隨機字段。。。。



--------------------------------------有一條分割線--------------------------------------

說下自己的感受:

1、拿來主義雖然方便,但是並不萬能,畢竟做技術要提升自身的能力。帶着學習的眼光去抄去拿,不要只是爲了完成任務去抄去拿。

2、適時的記錄自身體悟說不定會有意外收穫

說些題外話,我想起了上學時候的事情,大家都可能遇到過這樣的事,有些同學經常抄別人的作業但是成績還不差,有些人抄別人作業就成績很差,我想大致原因就是如此吧,第一種的做法大概和學畫畫的時候的臨摹,雖然是抄但是在學習,而第二種就是偷懶,大抵如此吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章