MySQL Join 一对多关系的语法

Posted

技术标签:

【中文标题】MySQL Join 一对多关系的语法【英文标题】:MySQL Join syntax for one to many relationship 【发布时间】:2010-11-16 03:02:14 【问题描述】:

我有一种情况,我有一个标题表 (t1) 和另一个表,其中包含多个链接,这些链接以一对多的关系引用这些标题 (t2)。

我想要的是返回的标题的完整列表,并带有一个标志,该标志指示是否有与之关联的特定链接。

左加入和分组方式:

SELECT
    t1.id
    , t1.title
    , t2.link_id AS refId
FROM
    t1
    LEFT JOIN t2
        ON (t1.id = t2.title_id)
GROUP BY t1.id;

这很接近,因为它给了我 refId 列中的第一个 link_id 或 NULL。

现在,如果我有一个特定的 link_id 而不是让 t2 遍历整个数据集,我该如何约束结果?

如果我添加一个 WHERE 子句,例如:

WHERE t2.link_id = 123

我只获得了 link_id 匹配的少数记录,但我仍然需要在 refId 列中返回的完整标题集,除非 link_id = 123。

希望有人能帮忙

【问题讨论】:

【参考方案1】:

而不是在 WHERE 子句中,将您的条件放在 LEFT JOIN 子句中:

SELECT
    t1.id
    , t1.title
    , t2.link_id AS refId
FROM
    t1
    LEFT JOIN t2
        ON t1.id = t2.title_id AND t2.link_id = 123
GROUP BY t1.id;

【讨论】:

谢谢你们俩。完美运行。 :)【参考方案2】:

把它放在第二个表的连接条件中

SELECT t1.id, t1.title, t2.link_id as refId
FROM t1
LEFT JOIN t2 ON t1 = t2.title_id AND t2.link_id = 123
GROUP BY t1.id;

【讨论】:

应该是:ON t1.id = t2.title_id 吗?还是会在指定表的时候自动取pk?

以上是关于MySQL Join 一对多关系的语法的主要内容,如果未能解决你的问题,请参考以下文章

linq语法大全(转集)

mysql中一对一,一对多,多对多关系

LINQ学习之旅

MySQL数据篇之多表操作-----保姆级教程

LINQ to SQL语句之Join

MySQL 表的一对一对多多对多问题