【问题标题】:How to use Left Join with Conditions from Forein Key?如何在外键条件下使用左连接?
【发布时间】:2018-04-18 21:02:29
【问题描述】:

这是我的查询:

SELECT
    rec_trans.title,
    rec_trans.description,
    rec.datetime,
    rec.video_url,
    rec.image_preview

/使用记录和国家/

FROM
    record rec, country
LEFT JOIN record_translate rec_trans ON
   country.id =  rec_trans.Country_id  AND rec_trans.Record_id = rec.id

我来了

1054 - 列“country.id”在“on 子句”中未知

我想创建条件为rec_trans.country_id = country_id and rec_trans.record_id = rec.id的左连接

【问题讨论】:

  • @Lamak 不是那个问题,我已经更新了帖子。
  • 您要左连接到哪个表?两者都有?
  • 您的连接语法错误。
  • @JacobBarnes 我想加入rec_trans
  • SELECT rec_trans.title、rec_trans.description、rec.datetime、rec.video_url、rec.image_preview FROM record rec LEFT JOIN record_translate rec_trans ON rec_trans.Record_id = rec.id INNER JOIN country c ON c。 id = rec_trans.id

标签: mysql sql


【解决方案1】:

这两个表之间的逗号“交叉连接”

FROM record rec, country

但是使用“显式连接语法”要好得多,所以它应该是这样的:

FROM record rec
CROSS JOIN country

CROSS JOINrecord 的每一行与 country 的每一行相乘(如果每个表有 10 行,则 10 行 X 10 行 = 100 行)。这种类型的连接对于定位“缺失信息”非常有用。

您可以使用任何类型的多个连接,例如

FROM record rec
CROSS JOIN country
LEFT JOIN record_translate rec_trans ON country.id =  rec_trans.Country_id
                                    AND rec.id = rec_trans.Record_id
LEFT JOIN another_table2 t2 on country.id = t2.Country_id
LEFT JOIN another_table3 t3 on country.id = t3.Country_id

----

您的原始查询混合了 2 种连接样式:老式的“逗号语法”和 SQL 标准 (ANSI) 语法。处理混合样式查询的规则首先处理 SQL 标准语法,然后是旧的“逗号语法”;考虑到这一点,这是首先执行的:

FROM 记录记录 左加入 record_translate rec_trans ON COUNTRY.id = rec_trans.Country_id AND rec.id = rec_trans.Record_id

但是,您可以从 sn-p country 中看到尚未加入,因此产生了错误。通过始终如一地使用 SQL 标准语法,可以按预期处理连接,并且在处理左连接之前可以访问国家/地区。

因此:您不应在单个查询中混合使用“逗号语法”和 SQL 标准 (ANSI) 连接语法

【讨论】:

    【解决方案2】:

    永远不要FROM 子句中使用逗号。 始终使用正确、明确的JOIN 语法。在您的情况下,请使用 `CROSS JOIN:

    FROM record rec CROSS JOIN
         country LEFT JOIN record_translate rec_trans
         ON country.id =  rec_trans.Country_id  AND
            rec_trans.Record_id = rec.id
    

    正如您刚刚了解到的,,CROSS JOIN 并不完全相同,尽管两者都生成笛卡尔积。

    特别是,逗号不会传播符号以供以后在FROM 子句中使用。因此出现未知列错误。 CROSS JOIN 确实允许随后在 FROM 子句中使用这些列。

    【讨论】:

    • 请解释一下CROSS加入
    • @PauloRodrigues 。 . .它的作用与逗号相同,但使用显式的 JOIN 语法。
    • 他在您的回答之前编辑了问题,在他的编辑之前,Country 不在 FROM 列表中。不知道他的代码是最初还是当前在问题正文中的内容。
    • 我可以使用多个交叉连接??
    猜你喜欢
    • 2021-04-23
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2010-11-11
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多