MySQL LEFT JOIN 计数列 Join 3 个表
MySQL LEFT JOIN Count column Join 3 tables
我的数据库中有 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、0 和 null。
这是我的数据库的示例数据:
我的预期结果:(计数只是为了展示它的样子)
我已尝试创建此 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
从
debate_stakeholders a LEFT JOIN debate_groups b ON b.stakeholder_id = a.id
LEFT JOIN 辩论作为 d ON b.debate_id = d.id
通过...分组
a.id、b.debate_id、d.id
拥有<br>
计数(*) < 3
按 a.id、d.id 排序
限制 1
但这还没有完全计划好。
试试这个,希望这会有所帮助:
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
我必须承认 table 名字让我很困惑。 辩论__stakeholder 与辩论无关。而是属于启动包的利益相关者,也有属于启动包的辩论。至少这是我从 table 结构中读到的。然后一个辩论_组 由一个学生和一个辩论的利益相关者组成。把这叫做一个团体很奇怪。
但是,您似乎希望将所有利益相关者与启动包中的所有辩论结合起来(即获取所有组合)。然后你想计算有多少学生与每个这样的辩论/利益相关者组合相关。因此,编写一个查询来计算每个辩论和利益相关者的学生数(按辩论和利益相关者分组的聚合查询)并将其用作您外连接到辩论/利益相关者组合的子查询。
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;
此处演示:
我的数据库中有 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、0 和 null。
这是我的数据库的示例数据:
我的预期结果:(计数只是为了展示它的样子)
我已尝试创建此 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
从
debate_stakeholders a LEFT JOIN debate_groups b ON b.stakeholder_id = a.id
LEFT JOIN 辩论作为 d ON b.debate_id = d.id
通过...分组
a.id、b.debate_id、d.id
拥有<br>
计数(*) < 3
按 a.id、d.id 排序
限制 1
但这还没有完全计划好。
试试这个,希望这会有所帮助:
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
我必须承认 table 名字让我很困惑。 辩论__stakeholder 与辩论无关。而是属于启动包的利益相关者,也有属于启动包的辩论。至少这是我从 table 结构中读到的。然后一个辩论_组 由一个学生和一个辩论的利益相关者组成。把这叫做一个团体很奇怪。
但是,您似乎希望将所有利益相关者与启动包中的所有辩论结合起来(即获取所有组合)。然后你想计算有多少学生与每个这样的辩论/利益相关者组合相关。因此,编写一个查询来计算每个辩论和利益相关者的学生数(按辩论和利益相关者分组的聚合查询)并将其用作您外连接到辩论/利益相关者组合的子查询。
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;
此处演示: