我有一个有很多列的表(非常大),其中两个是“post”和“user”。 对于给定的“帖子”,我想知道哪个“用户”发布的最多。
我第一次考虑获取所有条目WHERE(post ='wanted_post'),然后抛出一个PHP黑客来找到我得到的最大“用户”值,但考虑到我的桌子大而且我的穷人MySQL微妙调用的知识,我正在寻找一种纯粹的MySQL方式来获取这个值(基本上是在给定“帖子”上发布最多的“用户”id。)
有可能吗?或者我应该依靠混合SQL-PHP解决方案吗?
谢谢, Cystack
答案 0 :(得分:5)
听起来这就是你想要的......我错过了什么?
SELECT user
FROM myTable
WHERE post='wanted_post'
GROUP BY user
ORDER BY COUNT(*) DESC
LIMIT 1;
编辑:解释此查询的作用:
希望前三行对熟悉SQL的人有意义。这是最后三行做有趣的事情。
GROUP BY user
- 这会在user
列中折叠具有相同值的行。如果这是查询中的最后一行,我们可能会期望输出如下:
+-------+
| user |
+-------+
| bob |
| alice |
| joe |
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 |
这显示了每位用户的帖子数量。
但是,在这种情况下,实际输出聚合函数的值并不是绝对必要的 - 我们可以将它用于排序,而不是实际输出数据。 (当然,如果您想知道您的顶级海报发布了多少帖子,也许您确实希望将其包含在您的输出中。)
DESC
关键字告诉数据库按降序排序,而不是默认的升序排序。
当然,排序后的输出看起来像这样(假设我们将COUNT(*)
留在SELECT
列表中):
+-------+-------+
| user | count |
+-------+-------+
| joe | 8 |
| bob | 3 |
| alice | 1 |
LIMIT 1
- 这可能是最容易理解的,因为它只会限制返回的行数。由于我们将列表从大多数帖子排序到最少帖子,而我们只想要顶级海报,我们只需要第一个结果。如果你想要前三张海报,你可以使用LIMIT 3
。