天天看點

MySQL的SQL 語句:根據從表記錄個數對主表排序

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,如需轉載請自行聯系原作者