MySQL,多个JOINS,一个计数。我自己无法解决

时间:2015-04-01 23:39:29

标签: mysql join count

我需要的所有文档,但我无法弄清楚如何解决这个问题。希望我能得到帮助。

联系人

contactId    artistname
1            Joe
2            Diplo
3            Skrillex
4            Deadmau5

groupId   groupname
1         House
2         Hiphop
3         Jazz

contact_group

id   contactId   groupId
1    1           1
2    1           2
3    2           1
4    3           3
5    4           1
6    4           2
7    4           3

contact_promo

id   promoId   contactId   click_date
1    1         1           2015-03-25 21:00:00
2    1         2           2015-03-25 21:00:00
3    1         3           NULL
4    1         4           2015-03-25 21:00:00
5    2         1           NULL
6    2         2           NULL
7    2         3           2015-03-25 21:00:00
8    2         4           NULL
9    3         1           2015-03-25 21:00:00
10   3         2           2015-03-25 21:00:00
11   3         3           NULL
12   3         4           2015-03-25 21:00:00

我想最终得到的部分查询:

SELECT c.contactId, c.artistname g.groupId
FROM contacts c
LEFT JOIN contact_group cg ON cg.contactId = c.contactId
LEFT JOIN groups g ON cg.groupId = g.groupId

除了评级部分之外,此查询为我提供了我想要最终完成的内容的概述。

我想要的评分是: 该评级是来自contact_promo表的click_date的COUNT。例如,如果contactId设置了3个click_dates,则必须在上面的查询旁边显示3(显示在最新的灰色“代码”部分中)

现在失败的是什么: 当我加入contact_promo表并添加COUNT(click_date)时,使用GROUP + ORDER by。它显示了他们所在的所有艺术家一次和一组。我想看到一位艺术家所在的所有小组,因为艺术家可以同时在多个小组中。我现在看到的:

contactId   artistname   groupId   rating
1           Joe          1         3
2           Diplo        1         2
3           Skrillex     1         3
4           Deadmau5     2         5

如您所见,比较我的当前结果和我的目标,是缺少一些数据。我看不到艺术家所在的所有团体。只有一个团体。

我想看到的概述:

contactId   artistname   groupId   rating
1           Joe          1         3
2           Diplo        1         2
3           Skrillex     1         3
4           Deadmau5     2         5
1           Joe          4         3
2           Skrillex     3         3
etc.

1 个答案:

答案 0 :(得分:1)

试试这个:

SELECT c.contactId, c.artistname, g.groupId, q.rating
FROM contacts c
LEFT JOIN contact_group cg ON cg.contactId = c.contactId
LEFT JOIN groups g ON cg.groupId = g.groupId
INNER JOIN (
  SELECT cp.contactId, count(click_date) rating FROM contact_promo cp 
    GROUP BY cp.contactId
) q ON q.contactId = c.contactId

或者这是一个小提琴:http://sqlfiddle.com/#!9/212c6/1

您是否希望click_dates的计数还包括那些为NULL?

联系人是否有可能不在团体中?如果没有,它们可以是内部连接,而不是左连接。