最近遇到一個需求,就是隨機取數據,本着拿來主義的精神,網上找了找,基本上都是這個下面這個內容,但是並不能讓人滿意:
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、適時的記錄自身體悟說不定會有意外收穫
說些題外話,我想起了上學時候的事情,大家都可能遇到過這樣的事,有些同學經常抄別人的作業但是成績還不差,有些人抄別人作業就成績很差,我想大致原因就是如此吧,第一種的做法大概和學畫畫的時候的臨摹,雖然是抄但是在學習,而第二種就是偷懶,大抵如此吧。