Очень простой сбой ВНУТРЕННЕГО ВХОДА MySQL - PullRequest
1 голос
/ 13 февраля 2012

Вот мое простое внутреннее соединение:

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 ]

4 голосов
/ 13 февраля 2012

Вам необходимо изменить эту часть:

locations.work_id = 'paintings.id'

к этому:

locations.work_id = paintings.id

Ваш текущий запрос требует, чтобы поле locations.work_id содержало фактическое буквальное значение "paintings.id"; вам нужно, чтобы в поле locations.work_id содержалось такое же значение , как в поле paintings.id.

2 голосов
/ 13 февраля 2012

Ваше предложение ON содержит ошибку:

AND locations.work_id = 'paintings.id'

Вы используете одинарные кавычки, что делает его строковым литералом.Замените их обратными галочками, и у вас все будет хорошо:

AND locations.work_id = `paintings`.`id`
1 голос
/ 13 февраля 2012

Использование:

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 являются псевдонимами таблиц, поэтому вам не нужно каждый раз вводить полное имя.
  • backticks (`) используются MySQL для экранирования текста, если вы используете MySQL зарезервированные слова .В противном случае они не являются необходимыми, и я рекомендую не использовать зарезервированные слова.
  • размещение критериев JOIN не имеет значения для ВНУТРЕННИХ СОЕДИНЕНИЙ, но имеет значение для ВНЕШНЕГО - будьте осторожны.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...