我需要的所有文档,但我无法弄清楚如何解决这个问题。希望我能得到帮助。
联系人
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.
答案 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?
联系人是否有可能不在团体中?如果没有,它们可以是内部连接,而不是左连接。