一個主表 news,有字段 nId(自動增長),sName。
記錄:
10 name10
13 name13
20 name20
21 name20
-
21 name20
30 name20
從表 reply,字段 nId(自動增長),pId,sReply。
記錄:
20 aaaaa
13 bbbbb
10 ccccccc
20 vvvvvv
20 hhhhhh
10 sssss
從表以字段 pId 與主表字段 nId 關聯(lián)。
目的:由主表取若干記錄,排序依據(jù):根據(jù)從表中與主表關聯(lián)的記錄的個數(shù)來排序。
以上述的記錄為例,主表的記錄順序應該為:
20 name20
10 name10
13 name13
答案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,第一例似乎比較容易理解,即從聯(lián)合查表的結果中再次查表。聯(lián)合查表的結果作為一個“表”,再操作它 - 注意這里的 SQL 語句的語法值得借鑒。
3,好的解決方法應該是第二例。
4,但以上兩例的做法的最大缺點是,效率太低!聯(lián)合查表是最表的笛卡爾乘積,查詢數(shù)量是兩個表記錄數(shù)的乘積。這對于大表查詢將是致命的。
好的做法是,在主表中建一個字段表示從表的記錄個數(shù),每次向從表插入記錄和刪除記錄時都同時修改該字段的值。則達到題目的目的,只要查主表、排序就可以了。
本文出自:億恩科技【1tcdy.com】
服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]
|