MySQL LEFT JOIN 问题 : Retrieve workshops names in column A and a row id in column B

标签 mysql sql

对垃圾问题标题表示歉意,但是将我的要求总结为一行有点棘手。我通常对 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_idworkshop_idDELEGATESWORKSHOPS 表的外键。

由于任何给定的代表都可以分配到多个研讨会,因此我使用 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/

相关文章:

mysql - 划分2个查询语句的列表

android - 第一个 sqlite 数据库 : trying to add integers to database

sql - 如何从包含百万个记录的数据库中选择第一个 'N'记录?

sql - 用新条目更新表列

sql - 为什么我不能动态更改数据库 SQL Server 2008

mysql - 删除指定了 3 个字段中的 2 个的 mysql 行?

mysql - SQL 查询返回特定标签(如果存在)(如果不存在则返回 0)

sql - Union 导致无法将 ntext 数据类型选为 DISTINCT,因为它不可比较

php - SQL语法只有两种类型的引号问题?

c# - 使用 C# 控制台应用程序缓存 MYSQL 结果