我有一个表(很大的一个)有很多列,其中两个是"post"和"user".对于给定的"帖子",我想知道哪个"用户"发布最多.
我首先考虑获取所有条目WHERE(post ='wanted_post'),然后抛出一个PHP hack来查找我得到的最大"用户"值,但考虑到我的表的大小,以及我对MySQL的了解不足微妙的调用,我正在寻找一种纯MySQL的方式来获得这个值(基本上在给定的"帖子"上发布最多的"用户"id).
可能吗 ?或者我应该依靠混合SQL-PHP解决方案?
谢谢,Cystack
听起来这就是你想要的......我错过了什么吗?
SELECT user
FROM myTable
WHERE post='wanted_post'
GROUP BY user
ORDER BY COUNT(*) DESC
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
编辑:解释此查询的作用:
希望前三行对任何熟悉SQL的人都有意义.这是最后三行做有趣的事情.
GROUP BY user- 这会折叠列中具有相同值的user行.如果这是查询中的最后一行,我们可能会期望输出如下:
+-------+
| user |
+-------+
| bob |
| alice |
| joe |
Run Code Online (Sandbox Code Playgroud)ORDER BY COUNT(*) DESC- COUNT(*)是一个聚合函数,与前一个GROUP BY子句一起使用.它统计GROUP BY了每个用户"折叠"的所有行.通过略微修改的语句可能更容易理解它正在做什么,并且它是潜在的输出:
SELECT user,COUNT(*)
FROM myTable
WHERE post='wanted_post'
GROUP BY user;
+-------+-------+
| user | count |
+-------+-------+
| bob | 3 |
| alice | 1 |
| joe | 8 |
Run Code Online (Sandbox Code Playgroud)
这显示了每个用户的帖子数量.
但是,在这种情况下,实际输出聚合函数的值并不是绝对必要的 - 我们可以将它用于排序,而不是实际输出数据.(当然,如果您想知道您的顶级海报发布了多少帖子,也许您确实希望将其包含在您的输出中.)
该DESC关键字告诉数据库按降序排列,而不是按升序排列的默认排序.
当然,排序的输出会是这个样子(假设我们离开COUNT(*)的SELECT列表):
+-------+-------+
| user | count |
+-------+-------+
| joe | 8 |
| bob | 3 |
| alice | 1 |
Run Code Online (Sandbox Code Playgroud)LIMIT 1 - 这可能是最容易理解的,因为它只限制返回的行数.由于我们将列表从大多数帖子排序到最少帖子,而我们只想要顶级海报,我们只需要第一个结果.如果你想要前三张海报,你可以改用LIMIT 3.
| 归档时间: |
|
| 查看次数: |
2929 次 |
| 最近记录: |