对垃圾问题标题表示歉意,但是将我的要求总结为一行有点棘手。我通常对 MySQL JOIN 没有任何问题,但这个问题让我很困惑。
我正在构建一个培训反馈系统,其中一个功能希望显示数据库中所有可用研讨会的列表,指定代表已被分配到哪些研讨会,以及该代表是否已针对这些研讨会提交了任何反馈指定的研讨会。
我可以通过几个查询来完成此操作,但我正在尝试通过单个查询做一些更优雅的事情。
我的数据库结构的相关细节:
WORKSHOPS
表
- id:INT
- 名称:TINYTEXT
代表
表
- id:INT
- 名称:TINYTEXT
反馈
表
- delegate_id:INT
- workshop_id:INT
- 反馈:文本
DELEGATES_X_WORKSHOPS
表
- delegate_id:INT
- workshop_id:INT
delegate_id 和 workshop_id 是 DELEGATES
和 WORKSHOPS
表的外键。
由于任何给定的代表都可以分配到多个研讨会,因此我使用 DELEGATES_X_WORKSHOPS
表作为交叉引用表,以便我可以快速搜索谁被分配到任何给定的研讨会或哪些研讨会任何给定的代表都被分配给。
但是,我尝试了几种不同的 LEFT JOINing 方式,但对于给定的 delegate_id,我无法获得左侧研讨会的完整列表和右侧的匹配项(如果存在)。
示例数据 委托(delegate) Ross 的 delegate_id = 1 已注册的研讨会有
- C++
- PHP
- ASP.NET
- HTML5
- JavaScript
Ross 被分配到 PHP、HTML5 和 JavaScript
问题 1 是这样的:如何为 delegate_id=1 返回以下内容:
[workshop] | [assigned]
C++ | null
PHP | TRUE
ASP.NET | null
HTML5 | TRUE
JavaScript | TRUE
(现在 B 列中的内容并不重要,如果特定的 delegate_id 尚未分配给研讨会,我只想要一个 null)。
我用过这个:
SELECT
workshops.name,
delegates_x_workshops.delegate_id
FROM
workshops
LEFT JOIN
delegates_x_workshops
ON
workshops.id=delegates_x_workshops.workshop_id
WHERE
delegates_x_workshops.delegate_id=1
但是,我只返回 delegate_id=1 的 3 行,而不是所有研讨会的 5 行。
问题 2 有点复杂: 以问题 1 为基础,如果罗斯被分配到的研讨会有反馈,我将如何工作 C 列来显示?
[workshop] | [assigned] | [givenfeedback]
C++ | null | null
PHP | TRUE | TRUE
ASP.NET | null | null
HTML5 | TRUE | null
JavaScript | TRUE | TRUE
提前感谢所有能走到这一步并且知道我在胡言乱语的人。正如我所说,我可以通过几个不同的查询来快速解决这个问题,但我试图让事情保持优雅。
毫无疑问,其中一半需要澄清,所以如有任何问题,请提出。
谢谢
最佳答案
对于问题 1,您需要将 where
条件移至 on
子句中。它将左外连接
转换为内连接
,因为不匹配的行具有NULL
值:
SELECT w.name, dxw.delegate_id
FROM workshops w LEFT JOIN
delegates_x_workshops dxw
ON w.id = dxw.workshop_id and
dxw.delegate_id = 1;
对于第二个问题,我认为这就是你想要的:
SELECT w.name,
(case when max(w.name = 'Ross') > 0 then 'True' end) as Assigned,
(case when count(f.workshop_id) > 0 then 'True' end) as Feedback
FROM workshops w LEFT JOIN
delegates_x_workshops dxw
ON w.id = dxw.workshop_id and
dxw.delegate_id = 1 LEFT JOIN
delegates d
on d.id = dxw.delegate_id LEFT JOIN
feedback f
on f.workshop_id = w.id
GROUP BY w.name;
关于MySQL LEFT JOIN 问题 : Retrieve workshops names in column A and a row id in column B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21971228/