非常简单的MySQL INNER JOIN失败

时间:2012-02-12 21:30:19

标签: mysql sql join

这是我简单的内部联接:

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多个结果。

我做错了什么?

谢谢...

3 个答案:

答案 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语法而不确保与另一个表有关系 - 在这些情况下,它会生成一个笛卡尔积。

其他:

  • ploc是表别名,因此您不必每次都输入整个名称。
  • 在您使用MySQL reserved words的情况下,MySQL使用
  • 反引号(`)来转义文本。否则,它们不是必需的,我建议不要使用保留字。
  • JOIN标准的位置对INNER JOINs无关紧要,但对于OUTER也是如此 - 小心。