本文共 979 字,大约阅读时间需要 3 分钟。
MySQL的SQL 语句:根据从表记录个数对主表排序
一个主表 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 关联。
目的:由主表取若干记录,排序依据:根据从表中与主表关联的记录的个数来排序。
以上述的记录为例,主表的记录顺序应该为:
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,第一例似乎比较容易理解,即从联合查表的结果中再次查表。联合查表的结果作为一个“表”,再操作它 - 注意这里的 SQL 语句的语法值得借鉴。 3,好的解决方法应该是第二例。 4,但以上两例的做法的最大缺点是,效率太低!联合查表是最表的笛卡尔乘积,查询数量是两个表记录数的乘积。这对于大表查询将是致命的。 好的做法是,在主表中建一个字段表示从表的记录个数,每次向从表插入记录和删除记录时都同时修改该字段的值。则达到题目的目的,只要查主表、排序就可以了。
本文转自网眼51CTO博客,原文链接:http://blog.51cto.com/itwatch/286528,如需转载请自行联系原作者