mysql - SQL分組排序、隨機(jī)問(wèn)題?
問(wèn)題描述
有一個(gè)帖子的回復(fù)表,posts(id , tid , subject ,message ,dateline),其中:id為自動(dòng)增長(zhǎng)字段,tid為該回復(fù)的主體帖子的id(外鍵關(guān)聯(lián)),subject為回復(fù)標(biāo)題,message為回復(fù)內(nèi)容,dateline為回復(fù)時(shí)間,用UNIX時(shí)間戳表示。請(qǐng)寫(xiě)SQL,
選出按時(shí)間排序的前十個(gè)來(lái)自不同主題的最新回復(fù);
隨機(jī)選一條回復(fù)記錄;
問(wèn)題解答
回答1:目測(cè)1樓第一句不對(duì),沒(méi)有保證不同的主題,我是這么寫(xiě)的:
select * from posts p where p.dateline = (select max(dateline) from posts where tid = p.tid) order by dateline desc limit 10;
其實(shí)dateline和id應(yīng)該順序是一致的,可以考慮換成id,id上主鍵應(yīng)該效率更高:
select * from posts p where p.id = (select max(id) from posts where tid = p.tid) order by id desc limit 10;
第2句個(gè)人覺(jué)得最好還是不用ORDER BY RAND(),數(shù)據(jù)量稍微多一點(diǎn)就會(huì)效率低下,因?yàn)檫@樣寫(xiě)可以會(huì)導(dǎo)致多次掃描,這樣寫(xiě)可能會(huì)好一點(diǎn):
SELECT * FROM posts WHERE id >= ((SELECT MAX(id) FROM posts)-(SELECT MIN(id) FROM posts)) * RAND() + (SELECT MIN(id) FROM posts) LIMIT 1;回答2:
試試看,如果表數(shù)據(jù)過(guò)大不建議使用ORDER BY RAND(),你先試試這兩句SQL行不行。希望對(duì)你有幫助.
SELET `id`,`tid`,`subject`,`message`,`dateline` FROM `posts` WHERE `tid`=NULL ORDER BY `tid`,`dateline`SELET `id`,`tid`,`subject`,`message`,`dateline` FROM `posts` WHERE `tid`=!NULL ORDER BY RAND() LIMIT 1回答3:
樓上第一條回答目測(cè)不對(duì)吧,以下個(gè)人見(jiàn)解,歡迎點(diǎn)評(píng)指教
select t2.* from (select tid,max(dateline) maxDateline from posts group by tid order by maxDateline desc limit 10)t1 inner join posts t2 on t1.tid=t2.tid and t1.maxDateline=t2.dateline
相關(guān)文章:
1. 編程小白 問(wèn)關(guān)于python當(dāng)中類的方法的參數(shù)問(wèn)題2. mysql - 求SQL語(yǔ)句:查詢某個(gè)值介于兩個(gè)字段值之間的記錄。3. linux - python -m參數(shù)4. (JAVA)最近在做到支付寶的一碼多付支付接口,發(fā)現(xiàn)沒(méi)有異步回調(diào)通知,需要自己輪詢查詢訂單狀態(tài),這個(gè)需要怎么實(shí)現(xiàn)?5. python中def定義的函數(shù)加括號(hào)和不加括號(hào)的區(qū)別?6. pip安裝提示Twisted錯(cuò)誤問(wèn)題(Python3.6.4安裝Twisted錯(cuò)誤)7. html的qq快捷登錄怎么搞?求個(gè)源碼8. mysql - 分庫(kù)分表、分區(qū)、讀寫(xiě)分離 這些都是用在什么場(chǎng)景下 ,會(huì)帶來(lái)哪些效率或者其他方面的好處9. mysql - select查詢多個(gè)紀(jì)錄的條件怎么寫(xiě)10. python - 有哪些預(yù)測(cè)算法可以根據(jù)實(shí)時(shí)增量數(shù)據(jù)更新算法并預(yù)測(cè)后續(xù)數(shù)據(jù)?
