MySQL使用GROUP BY按多列分组

时间:2012-01-06 08:03:18

标签: mysql sql select group-by

我想使用GROUP BY多列,我认为最好从一个例子开始:

SELECT
    eventsviews.eventId,
    showsActive.showId,
    showsActive.venueId,
    COUNT(*) AS count
FROM eventsviews

INNER JOIN events ON events.eventId = eventsviews.eventId
INNER JOIN showsActive ON showsActive.eventId = eventsviews.eventId

WHERE events.status = 1

GROUP BY showsActive.venueId, showsActive.showId, showsActive.eventId
ORDER BY count DESC
LIMIT 100;

输出:

| *eventId* | *showId* | *venueId* | *count* |
+-----------+----------+-----------+---------+
  [...snip...]
| 95        | 92099    | 9770      | 32      |
| 95        | 105472   | 10702     | 32      |
| 3804      | 41225    | 8165      | 17      |
| 3804      | 41226    | 8165      | 17      |
| 923       | 2866     | 5451      | 14      |
| 923       | 20184    | 5930      | 14      |
  [...snip...]

我想要的是:

| *eventId* | *showId* | *venueId* | *count* |
+-----------+----------+-----------+---------+
| 95        | 92099    | 9770      | 32      |
| 3804      | 41226    | 8165      | 17      |
| 923       | 20184    | 5930      | 14      |

所以,我希望我的数据按eventId分组,但每个showId和venueId只需一次......

我实际上有一个SQL查询可以做到这一点,但它有8个子查询,并且和T-Ford一样慢...而且因为这是在每个页面加载时执行的,所以加快速度看起来是个好主意!

有几个这样的问题,我尝试了很多不同的东西,但我已经在这个查询中待了一个小时,我似乎无法按照我的意愿去工作: - (

谢谢!

2 个答案:

答案 0 :(得分:1)

你可能想要showid上的最小值或最大值,然后不要将它包含在组中,我不知道哪个因为查看你的“首选”结果集,你有两个。

答案 1 :(得分:0)

如果您希望按eventId对数据进行分组,请按eventId进行分组,您将获得您正在寻找的结果。

这是一个MySQL功能(?),它允许您选择非聚合列,在这种情况下,它将返回第一行可用。在其他DBMS中,它是由DISTINCT ON实现的,这在MySQL中不可用。