表中给定值的最大出现次数

时间:2011-07-10 07:49:02

标签: mysql

我有一个有很多列的表(非常大),其中两个是“post”和“user”。 对于给定的“帖子”,我想知道哪个“用户”发布的最多。

我第一次考虑获取所有条目WHERE(post ='wanted_post'),然后抛出一个PHP黑客来找到我得到的最大“用户”值,但考虑到我的桌子大而且我的穷人MySQL微妙调用的知识,我正在寻找一种纯粹的MySQL方式来获取这个值(基本上是在给定“帖子”上发布最多的“用户”id。)

有可能吗?或者我应该依靠混合SQL-PHP解决方案吗?

谢谢, Cystack

1 个答案:

答案 0 :(得分:5)

听起来这就是你想要的......我错过了什么?

SELECT user
FROM myTable
WHERE post='wanted_post'
GROUP BY user
ORDER BY COUNT(*) DESC
LIMIT 1;

编辑:解释此查询的作用:

希望前三行对熟悉SQL的人有意义。这是最后三行做有趣的事情。

  1. GROUP BY user - 这会在user列中折叠具有相同值的行。如果这是查询中的最后一行,我们可能会期望输出如下:

    +-------+
    | user  |
    +-------+
    | bob   |
    | alice |
    | joe   |
    
  2. 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 |
    
  3. LIMIT 1 - 这可能是最容易理解的,因为它只会限制返回的行数。由于我们将列表从大多数帖子排序到最少帖子,而我们只想要顶级海报,我们只需要第一个结果。如果你想要前三张海报,你可以使用LIMIT 3