MySQL的SQL 語句:根據從表記錄個數對主表排序
一個主表 news,有字段 nId(自動增長),sName。
記錄:
10 name10
13 name13
20 name20
21 name20
30 name20
從表 reply,字段 nId(自動增長),pId,sReply。
20 aaaaa
13 bbbbb
10 ccccccc
20 vvvvvv
20 hhhhhh
10 sssss
從表以字段 pId 與主表字段 nId 關聯。
目的:由主表取若幹記錄,排序依據:根據從表中與主表關聯的記錄的個數來排序。
以上述的記錄為例,主表的記錄順序應該為:
答案1:
select *, count(*) as iReply from
(SELECT a.nId, a.sName, b.sReply FROM news a, reply b WHERE a.nId=b.pId) as T
group by nId order by iReply limit 0,3
答案2:
SELECT a.nId, a.sName, count(b.sReply) as iReply from FROM news a, reply b WHERE a.nId=b.pId
group by a.nId order by iReply limit 0,3
注:
1,以上兩例中形如 group by a.nId 的字段 nId 的值應該保持唯一性,最好是建有唯一性索引。
2,第一例似乎比較容易了解,即從聯合查表的結果中再次查表。聯合查表的結果作為一個“表”,再操作它 - 注意這裡的 SQL 語句的文法值得借鑒。
3,好的解決方法應該是第二例。
4,但以上兩例的做法的最大缺點是,效率太低!聯合查表是最表的笛卡爾乘積,查詢數量是兩個表記錄數的乘積。這對于大表查詢将是緻命的。
好的做法是,在主表中建一個字段表示從表的記錄個數,每次向從表插入記錄和删除記錄時都同時修改該字段的值。則達到題目的目的,隻要查主表、排序就可以了。
本文轉自網眼51CTO部落格,原文連結:http://blog.51cto.com/itwatch/286528,如需轉載請自行聯系原作者