这是我的疑问:
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
我得到了
我想创建条件为rec_trans.country_id = country_id and rec_trans.record_id = rec.id
答案 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 JOIN
将record
的每一行与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)连接语法。