MySQL LEFT JOIN计数列加入3个表

时间:2016-08-10 05:44:50

标签: mysql join left-join

我有3个表,它们是我数据库的一部分。

debates (id 'PK', unit_id, starter_pack_id 'FK', title)

debate_stakeholders (id 'PK', starter_pack_id 'FK', name)

debate_groups (id 'PK', debate_id 'FK', student_id, stakeholder_id 'FK')

为此目的,所有辩论共享相同的利益相关者(共有4个利益相关者,所有这些利益相关者都参考了所有辩论)。

我的预期结果的目的是查询所有辩论,显示与相关利益相关者有关的debates.id, debates.title, debate_stakeholders.name, and the Count of how many of those stakeholders occur within that particular debate,无论利益相关者的数量是否为0 。这一部分很重要,因为当我执行其他查询时,我需要知道哪些查询计数大于或等于1,零和null。

以下是我的数据库的示例数据:

enter image description here

我的预期结果:(计数只是为了表明它看起来像什么)

enter image description here

我试图创建这个MySQL查询,但我无法达到我的确切要求。

我尝试了诸如此类的查询 SELECT a.id, a.name, a.abbreviation, d.id AS debateId, IF(COUNT(b.stakeholder_id) = 0, 0, COUNT(b.stakeholder_id)) AS total_freq FROM debate_stakeholders a LEFT JOIN debate_groups b ON b.stakeholder_id = a.id LEFT JOIN debates as d ON b.debate_id = d.id GROUP BY a.id, b.debate_id,d.id HAVING
COUNT(*) < 3 ORDER BY a.id,d.id LIMIT 1

但那还没有完全计划好。

2 个答案:

答案 0 :(得分:2)

我必须承认表名让我感到困惑。 辩论 __利益相关者与辩论无关。它相当于属于初学者包的利益相关者,也有属于初学者包的辩论。至少这是我从表格结构中读到的内容。然后辩论小组由一名学生和辩论中的利益相关者组成。把这个称为一个群体是很奇怪的。

但是,您似乎希望将所有利益相关者与初学者包中的所有辩论相结合(即获得所有组合)。然后你想要计算每个这样的辩论/利益相关者组合有多少学生。因此,编写一个查询来计算每个辩论和利益相关者的学生(通过辩论和利益相关者分组的聚合查询),并将其用作外部参与辩论/利益相关者组合的子查询。

SELECT d.id,
       d.title,
       ds.name,
       COALESCE(dg.students, 0) AS "count"
FROM debates d
JOIN debate_stakeholders ds
    ON ds.starter_pack_id = d.starter_pack_id
LEFT JOIN
(
    SELECT debate_id, stakeholder_id, COUNT(*) AS students
    FROM debate_groups
    GROUP BY debate_id, stakeholder_id
) dg
    ON dg.debate_id = d.id AND
       dg.stakeholder_id = ds.id;

在这里演示:

SQLFiddle

答案 1 :(得分:0)

试试这个,希望这会有所帮助:

SELECT d.id, COALESCE(d.title, 'NA') AS title, COALESCE(ds.name, 'NA') AS name, COUNT(ds.id) AS count
FROM debates d
LEFT JOIN debate_groups AS dg ON d.id = dg.debate_id
LEFT JOIN debate_stakeholders AS ds ON dg.stakeholder_id = ds.id
GROUP BY d.id, dg.stakeholder_id