如何使用Forein Key的条件左连接?

时间:2017-11-06 16:20:37

标签: mysql sql

这是我的疑问:

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 - 'on clause'

中的Coluna'agest.id'未知

我想创建条件为rec_trans.country_id = country_id and rec_trans.record_id = rec.id

的左连接

2 个答案:

答案 0 :(得分:1)

从不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子句中使用这些列。

答案 1 :(得分:1)

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

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

----

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

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

但是,正如您所看到的那样,片段country尚未加入,因此产生了错误。通过一致地使用SQL标准语法,可以按预期处理连接,并且在处理左连接之前可以访问国家/地区。

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