这是我简单的内部联接:
SELECT paintings.*, locations.*
FROM paintings
INNER JOIN locations
ON locations.work_type = 'paintings' AND locations.work_id = 'paintings.id'
WHERE locations.location LIKE '%19th%'
返回零结果。我希望它能找到每个在位置表中匹配的绘画行,基于具有共同的work_type和id。我知道有比赛是因为
SELECT * FROM locations WHERE location LIKE '%19th%' AND work_type = 'paintings'
我得到1000多个结果。
我做错了什么?
谢谢...
答案 0 :(得分:4)
您需要更改此部分:
locations.work_id = 'paintings.id'
到此:
locations.work_id = paintings.id
您当前的查询要求locations.work_id
字段包含实际的字面值" paintings.id&#34 ;;您想要的是要求locations.work_id
字段包含与paintings.id
字段相同的相同值。
答案 1 :(得分:2)
您的ON
子句包含错误:
AND locations.work_id = 'paintings.id'
您正在使用单引号,这使其成为字符串文字。用反引号代替那些你应该没问题:
AND locations.work_id = `paintings`.`id`
答案 2 :(得分:1)
使用:
SELECT p.*,
loc.*
FROM PAINTINGS p
JOIN LOCATIONS loc ON loc.work_id = p.id
AND loc.work_type = 'paintings'
AND loc.location LIKE '%19th%'
问题是paintings.id
周围的单引号 - 这使得SQL将其解释为字符串,而不是JOIN条件的列。 MySQL支持JOIN
语法而不确保与另一个表有关系 - 在这些情况下,它会生成一个笛卡尔积。
其他:
p
和loc
是表别名,因此您不必每次都输入整个名称。