注: 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 关联。
目的:由主表取若干记录,排序依据:根据从表中与主表关联的记录的个数来排序。
以上述的记录为例,主表的记录顺序应该为:
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,但以上两例的做法的最大缺点是,效率太低!联合查表是最表的笛卡尔乘积,查询数量是两个表记录数的乘积。这对于大表查询将是致命的。
好的做法是,在主表中建一个字段表示从表的记录个数,每次向从表插入记录和删除记录时都同时修改该字段的值。则达到题目的目的,只要查主表、排序就可以了。

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
C++高性能并发应用_C++如何开发性能关键应用
Java AI集成Deep Java Library_Java怎么集成AI模型部署
Golang后端API开发_Golang如何高效开发后端和API
Python异步并发改进_Python异步编程有哪些新改进
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
Java GraalVM原生镜像构建_Java怎么用GraalVM构建高效原生镜像
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
C++现代C++20/23/26特性_现代C++有哪些新标准特性如modules和coroutines
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号