• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

MySQL的SQL 语句:根据从表记录个数对主表排序

mysql 搞代码 4年前 (2022-01-09) 26次浏览 已收录 0个评论

注: 1,以上两例中形如 group by a.nId 的字段 nId 的值应该保持唯一性,最好是建有唯一性索引。 2,第一例似乎比较容

一个主表 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 关联。

目的:由主表取若干记录,排序依据:根据从表中与主表关联的记录的个数来排序。

以上述的本文来源[email protected]搞@^&代*@码2网记录为例,主表的记录顺序应该为:
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,但以上两例的做法的最大缺点是,效率太低!联合查表是最表的笛卡尔乘积,查询数量是两个表记录数的乘积。这对于大表查询将是致命的。
好的做法是,在主表中建一个字段表示从表的记录个数,每次向从表插入记录和删除记录时都同时修改该字段的值。则达到题目的目的,只要查主表、排序就可以了。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MySQL的SQL 语句:根据从表记录个数对主表排序
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址