2012-06-29 3 views
1

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

Вот исходный запрос, который работает:

$listing_sql = "select " . $select_column_list . " p.products_id, p.products_model, 

p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, 
s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, 
s.specials_new_products_price, p.products_price) as final_price 

from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p 
left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id 
left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, 
" . TABLE_PRODUCTS_TO_CATEGORIES . " p2c 

where p.products_status = '1' and p.products_id = p2c.products_id and 
pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and 
p2c.categories_id = '" . (int)$current_category_id . "'"; 

а вот новый запрос с добавленной таблицы и где пункт (TABLE_PRODUCTS_ATTRIBUTES является новая таблица годовых):

$listing_sql = "select " . $select_column_list . " p.products_id, p.products_model, 
p.manufacturers_id, p.products_price, pa.products_values_id, p.products_tax_class_id, 
IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, 
IF(s.status, s.specials_new_products_price, p.products_price) as final_price 

from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p, " . 

TABLE_PRODUCTS_ATTRIBUTES . " pa 
left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id 
left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, 
" . TABLE_PRODUCTS_TO_CATEGORIES . " p2c 

where p.products_status = '1' and p.products_id = p2c.products_id and p.products_id = 
pa.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . 
(int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'"; 

Что случилось с моим запросом сразу?

+0

Что говорит mysql_error()? –

+0

Какая фактическая строка выглядит после всего, что сделано? Кроме того, SQL-инъекция - http://www.securiteam.com/securityreviews/5DP0N1P76E.html – McAden

+0

В чем вы присоединяетесь в третьей таблице? Проблема заключается в вашем соединении ... Существует такое же количество операторов соединения, но больше таблиц, mysql не собирается знать, что вы хотите ... С левым соединением Это даст вам огромную таблицу результатов, если это действительно работает (в столбце) Посмотрите на ответ Марка. – Hituptony

ответ

3

Проблема в том, что вы смешиваете синтаксис соединения в стиле запятой с ключевым словом JOIN. Поскольку они имеют различный приоритет, объединения не выполняются в ожидаемом порядке (вероятно, вы ожидали, что порядок слева направо).

MySQL manual специально предупреждает о смешивании двух типов присоединения:

Тем не менее, приоритет оператора запятой меньше, чем INNER JOIN, CROSS JOIN, LEFT JOIN, и так далее. Если вы смешиваете запятую с другими типами соединений, когда есть условие соединения, может возникнуть ошибка формы Неизвестный столбец «col_name» в разделе «on».

Простое изменение, которое вы могли бы сделать, чтобы исправить ошибку, чтобы изменить порядок TABLE_PRODUCTS_ATTRIBUTES и TABLE_PRODUCTS:

from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " 
. TABLE_PRODUCTS_ATTRIBUTES . " pa, " 
. TABLE_PRODUCTS . " p 

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

+0

Я немного смущен тем, как я смешиваю синтаксис, главным образом потому, что этот запрос уже был сделан с микс, который я думаю. Итак, если бы я должен был удалить левые соединения, я бы просто использовал предложения where, чтобы они соответствовали полям products_id. или удалить предложения where, относящиеся к объединению запятой, и использовать ключевое слово join? Использование ключевого слова join - лучший способ? – Sackling

+1

@Sackling: «Использование ключевого слова join - лучший способ?» Да. Дополнительное чтение: [Почему стандарт ANSI-92 не лучше, чем ANSI-89?] (Http://stackoverflow.com/questions/334201/why-isnt-sql-ansi-92-standard-better-adopted- over-ansi-89) –

+0

Прохладный. Спасибо! – Sackling

0

Попробуйте изменить эту строку в запросе:

from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_ATTRIBUTES . " pa 

To:

from (" . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_ATTRIBUTES . " pa) 

Скобки будет Неуверенные порядок, в котором соединяются таблицы является порядок вы ожидаете.

Смежные вопросы