MySQL,多次JOINS,一次计数。无法自行解决

MySQL, multiple JOINS, one count. Can't solve on my own

这里有我需要的所有文档,但我就是不知道如何解决这个问题。希望我能得到帮助。

联系人

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

除了 rating 部分之外,此查询让我很好地了解了我想要得到的结果。

我想要的评分是: 评分是 click_date 来自 table contact_promo 的 COUNT。因此,例如,如果 contactId 设置了 3 click_dates,它必须在上面的查询旁边显示 3(显示在最新的灰色 'code' 部分)

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

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.

试试这个:

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

或者这里是 fiddle: http://sqlfiddle.com/#!9/212c6/1

您是否希望 click_dates 的计数也包括 NULL 的计数?

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