【问题标题】:MySQL using GROUP BY to group by multiple columnsMySQL 使用 GROUP BY 按多列分组
【发布时间】:2012-01-06 08:03:18
【问题描述】:

我想使用 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 一样慢......而且由于这是在 每个 页面加载时执行的,因此可以加快速度看起来是个好主意!

有几个这样的问题,我尝试了很多不同的事情,但我已经在这个查询中待了一个小时,我似乎无法让它按我想要的方式工作:-(

谢谢!

【问题讨论】:

  • 您想使用什么规则来仅选择一个 showId/venueId?

标签: mysql sql select group-by


【解决方案1】:

您可能想要 showid 的最小值或最大值,然后不将其包含在 group by 中,我不知道是哪个,因为查看您的“首选”结果集,两者都有。

【讨论】:

    【解决方案2】:

    如果您希望您的数据按 eventId 分组,只需按 eventId 分组,您就会得到您正在寻找的结果。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 2020-07-14
      • 1970-01-01
      • 2015-02-13
      相关资源
      最近更新 更多