2012-01-06 54 views
0

我想使用GROUP BY多列,我认为这是最好的一个例子开始:MySQL的使用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一样慢...并且因为这是在每页执行页面加载,所以加快速度看起来像一个很好的理念!

有几个这样的问题,我尝试了很多不同的事情,但我一直在这个查询一个小时,我似乎无法让它工作,因为我想:-(

谢谢!

+0

你想用什么规则来选择一个showId/venueId? – MatBailie 2012-01-06 10:08:59

回答

1

你可能想要一个min或max的showid,然后不包含它在group by中,我不能告诉哪个因为看着你的“首选”结果集,你有两个。

0

如果你希望自己的数据被EVENTID,小组分组只是EVENTID,你会得到正是你正在寻找的结果。

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