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 的计数?
是否有可能联系人不在群组中?如果不是,它们可以是内连接,而不是左连接。
这里有我需要的所有文档,但我就是不知道如何解决这个问题。希望我能得到帮助。
联系人
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 的计数?
是否有可能联系人不在群组中?如果不是,它们可以是内连接,而不是左连接。