求一个 SQL 语句不知去重还是分组来实现

2016-06-27 11:13:51 +08:00
 feikeq
现在学过的东西想再用时却忘干净了,就像解一元二次方程,小时候很会解,现在怎么不知怎么开始解。。。。


原表内容
+--------------------+
| id | name | fid |
+--------------------+
| 101 | aaaa | |
+--------------------+
| 102 | bbbb | 101 |
+--------------------+
| 103 | cccc | 102 |
+--------------------+
| 104 | dddd | 101 |
+--------------------+

查询结果
+--------------------+
| id | name | sum |
+--------------------+
| 101 | aaaa | 2 |
+--------------------+
| 102 | bbbb | 1 |
+--------------------+
5270 次点击
所在节点    MySQL
24 条回复
feikeq
2016-06-27 15:20:03 +08:00
@txoooy 的方法查询要 0.07 秒,采用下面方法只需 0.02 秒

SELECT T1.`uid`,T1.`headimg`, T1.`nickname` ,T1.`referer` ,T2.`num`
FROM `user_center` AS T1 LEFT JOIN (
SELECT C.`referer` AS uid, count(`referer`) AS num
FROM `user_center` C, `user_open` O
WHERE C.`uid`= O.`uid`
AND O.`subscribe`=1
GROUP BY C.`referer`
) AS T2
ON T1.`uid`= T2.`uid`
WHERE T2.`num` IS NOT NULL
ORDER BY T2.`num` DESC
txoooy
2016-06-27 15:22:20 +08:00
这个要分情况, 有些情况中利用子查询构建中间表可以提高性能, 不过你现阶段并不需要考虑这些, sql 优化东西太多了, 多写多看, 自然知道什么时候用什么方法
wavingclear
2016-06-27 16:41:37 +08:00
地球思维的写法
SELECT id, name, num FROM test INNER JOIN ( SELECT fid, COUNT(fid) as num FROM `test` GROUP BY fid) AS temp ON ( test.id = temp.fid )

修改之后的写法,不用子查询
SELECT a.id, a.name, count(b.fid) as num FROM test as a INNER JOIN test as b ON (a.id = b.fid) GROUP BY b.fid
wavingclear
2016-06-27 16:44:25 +08:00
啊 17 楼已经写过了……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/288542

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX