Почему 2 левых соединения в одном запросе вызывают ошибку? - PullRequest
3 голосов
/ 10 июня 2011

Примечание : Если вы ищете решение своей проблемы и вас привлекли, это, вероятно, вам не поможет.Если вы не анализируете один SQL-запрос на наличие ошибки, а на самом деле ошибка может существовать в запросе, который следует , этот вопрос, без вашего ведома, может вам не помочь.Я просто предупреждаю вас сейчас, потому что ни одна из данных, приведенных в этом вопросе, на самом деле не приводит к ответу.

Чтобы расширить таблицу базы данных regular_rules без изменения самой таблицы, я создал дополнительную таблицу (extended_rules), ПК которой также является FK до regular_rules.Затем я могу поместить любые новые столбцы в extended_rules, и каждый раз, когда я загружаю из него запись, мне просто нужно присоединить ее к regular_rules, чтобы обработать ее, как будто это полный объект.Таким образом, как вы можете видеть, эти две таблицы имеют отношение один-к-одному.

Однако regular_rules также имеет отношение один-ко-многим с другой таблицей (rule_coupons), которая такженеобходимо объединить.

Таким образом, у меня есть следующий запрос:

SELECT `main_table`.*, `primary_coupon`.`code`, `regular_rules`.*
FROM `extended_rules` AS `main_table`
LEFT JOIN `rule_coupons` AS `primary_coupon`
    ON main_table.rule_id = primary_coupon.rule_id AND primary_coupon.is_primary = 1
LEFT JOIN `regular_rules`
    ON `main_table`.`rule_id` = `regular_rules`.`rule_id`

Это выглядит прекрасно для меня.Однако я получаю следующее сообщение об ошибке:

SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец 'main_table.rule_id' in 'в предложении'

ThroughВ ходе тестирования я обнаружил, что эта ошибка возникает при втором соединении, несмотря на то, что я успешно получил main_table.rule_id всего за несколько минут до того же запроса.Интересно, что если я поменяю местами два соединения, ошибка все равно произойдет во втором, что заставляет меня поверить, что это может быть не логическая ошибка, а скорее синтаксическая ошибка, относящаяся к чему-то, чего я просто пока не понимаю.

Обратите внимание, что я не могу позволить себе роскошь изменять первое соединение (на rule_coupons), и что я могу изменить только второе соединение (на regular_rules) или добавить новые детали в запрос.

Редактировать: Интересная разработка ... Если я вставлю запрос в phpMyAdmin и выполню его там, он будет работать нормально.Я также собрал быстрый базовый PHP-скрипт для выполнения запроса с использованием mysqli, и это сработало нормально.Пока что, похоже, это происходит только в рамках платформы, на которой я строю ( Magento ).Я работал с Magento в течение долгого времени, и я никогда не сталкивался с такой странной проблемой с базой данных, как это раньше ... Поэтому я все еще не уверен, что не так, но, по крайней мере, теперь у вас есть немного больше контекста.

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Просто предположение: попробуйте опустить псевдоним таблицы и заключить в скобки слова ON:

SELECT `extended_rules`.*, `rule_coupons`.`code`, `regular_rules`.*
FROM `extended_rules`
LEFT JOIN `rule_coupons`
    ON (extended_rules.rule_id = rule_coupons.rule_id AND rule_coupons.is_primary = 1)
LEFT JOIN `regular_rules`
    ON (`extended_rules`.`rule_id` = `regular_rules`.`rule_id`)

Если это должно сработать, то это ошибка, которую я наблюдал несколько раз: похоже, у MySQL есть проблема, если вы используете псевдонимы для некоторых таблиц, но не для всех. В противном случае, просто игнорируйте то, что я написал; -)

1 голос
/ 20 июня 2011

Как оказалось, я отследил эту проблему до неправильного места в коде.

Как вы можете видеть, SQL предназначен для возврата коллекции результатов, как цель этого запросаэто заполнить сетку.Ошибка возникала всякий раз, когда я пытался загрузить эту сетку.К сожалению, я не знал, что кто-то другой выполнял другой запрос для каждой строки, которая была возвращена моим запросом.

Как только я понял это, я посмотрел на этот второй запрос, и там был источникпроблемы.Это также объясняет, почему выглядело так, как будто ошибка всегда возникала при «втором» соединении в запросе, независимо от того, что это было ... ошибка просто возникала после запроса, который я анализировал!

Все это означает, что информация, предоставленная мною в вопросе, не могла возможно привести к ответу, так как я ошибался с самого начала.Я прошу прощения у любого, кто пытался выяснить ответ и потратил впустую свое время.

...