Борьба с ВНУТРЕННИМИ СОЕДИНЕНИЯМИ - Глава: неизвестный столбец - PullRequest
1 голос
/ 31 августа 2010
SELECT p.id
FROM produkty p, przyporzadkowania pr, stany_magazynowe, gk_grupy_produkty
INNER JOIN sub_subkategorie ssi
ON pr.sub_subkategorie_id = ssi.ID

Таблицы и их важные поля

produkty - id, pozycja
przyporzadkowania - id, produkt_id, sub_kategoria_id, sub_subkategoria_id
sub_subkategorie - id, subkategorie_id, pozycja
subkategorie - id, kategorie_id, pozycja
kategorie - id, pozycja

Ошибка "# 1054 - Неизвестный столбец 'pr.sub_subkategorie_id' в 'предложении'"

Пробовал с

SELECT p.id, pr.sub_subkategorie_id

Тот же результат.

Полный запрос (не проверен из-за сбоя запроса выше):

SELECT p.id
FROM produkty p, przyporzadkowania pr, stany_magazynowe, gk_grupy_produkty
INNER JOIN sub_subkategorie ssi ON pr.sub_subkategorie_id = ssi.ID
INNER JOIN subkategorie si ON ssi.subkategorie_id = si.id
INNER JOIN kategorie c ON si.kategorie_id = c.id
WHERE stany_magazynowe.produkty_id = p.id
AND p.id = pr.produkty_id
AND pr.sub_subkategorie_id =1
AND p.widoczny = '1'
AND p.id = gk_grupy_produkty.id_produktu
AND gk_grupy_produkty.id_grupy =1
AND gk_grupy_produkty.towar_widocznosc =1
AND c.id = '1'
ORDER BY c.pozycja, si.pozycja, ssi.pozycja, p.pozycja

Надеюсь, что я дал достаточно информации (предыдущий вопрос - SELECT * ИЗ таблицы, ГДЕ поле IN (ВЫБЕРИТЕ идентификатор ИЗ таблицы ORDER BY field2) )

EDIT:

Да, есть опечатка, но только здесь, на стеке переполнения (слишком много кофе, мои пальцы летят). Спасибо всем, Вы спасли мой день!

Ответы [ 4 ]

6 голосов
/ 31 августа 2010

Вы объединяете таблицы в неправильном порядке:

SELECT p.id
FROM produkty p, stany_magazynowe, gk_grupy_produkty, przyporzadkowania pr
INNER JOIN sub_subkategorie ssi
ON pr.sub_subkategorie_id = ssi.ID

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

Вот ваш полный запрос, переписанный с использованием явных объединений:

SELECT p.id
FROM produkty p
INNER JOIN przyporzadkowania pr ON p.id = pr.produkty_id
INNER JOIN stany_magazynowe ON stany_magazynowe.produkty_id = p.id
INNER JOIN gk_grupy_produkty ON p.id = gk_grupy_produkty.id_produktu
INNER JOIN sub_subkategorie ssi ON pr.sub_subkategorie_id = ssi.ID
INNER JOIN subkategorie si ON ssi.subkategorie_id = si.id
INNER JOIN kategorie c ON si.kategorie_id = c.id
WHERE pr.sub_subkategorie_id = 1
AND p.widoczny = '1'
AND gk_grupy_produkty.id_grupy =1
AND gk_grupy_produkty.towar_widocznosc =1
AND c.id = '1'
ORDER BY c.pozycja, si.pozycja, ssi.pozycja, p.pozycja

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

1 голос
/ 31 августа 2010

Вы смешиваете "классические" объединения с ключевым словом join. Для всех объединений следует использовать ключевое слово join.

Ошибка возникает из-за того, что вы присоединяетесь к таблице gk_grupy_produkty, где это поле не существует. База данных действительно выглядит на ваш запрос как:

SELECT p.id
FROM
  produkty p,
  przyporzadkowania pr,
  stany_magazynowe,
  (gk_grupy_produkty INNER JOIN sub_subkategorie ssi ON pr.sub_subkategorie_id = ssi.ID)

Вы должны использовать:

SELECT p.id
FROM
  produkty p
  INNER JOIN przyporzadkowania pr ON p.id = pr.produkty_id
  INNER JOIN stany_magazynowe ON stany_magazynowe.produkty_id = p.id
  INNER JOIN gk_grupy_produkty ON p.id = gk_grupy_produkty.id_produktu
  INNER JOIN sub_subkategorie ssi ON pr.sub_subkategorie_id = ssi.ID
  INNER JOIN subkategorie si ON ssi.subkategorie_id = si.id
  INNER JOIN kategorie c ON si.kategorie_id = c.id
WHERE
  pr.sub_subkategorie_id = 1 AND
  p.widoczny = '1' AND
  gk_grupy_produkty.id_grupy = 1 AND
  gk_grupy_produkty.towar_widocznosc = 1 AND
  c.id = '1'
ORDER BY c.pozycja, si.pozycja, ssi.pozycja, p.pozycja
0 голосов
/ 31 августа 2010

Является ли столбец с именем sub_subkategoria_id опечаткой?

0 голосов
/ 31 августа 2010

Начните с этого: (заполните ??? )

SELECT p.id
FROM produkty p
JOIN przyporzadkowania pr ON p.??? = pr.???
JOIN sub_subkategorie ssi ON pr.sub_subkategorie_id = ssi.ID

(вам не нужно указывать INNER)

Ваш исходный пункт ОТ:

FROM produkty p, przyporzadkowania pr, stany_magazynowe, gk_grupy_produkty

Имеет таблицы p и pr, для которых не указано условие JOIN, которое приведет к декартовому произведению или перекрестному соединению (вероятно, в этом случае не очень хорошая вещь), а также таблицы, на которые нет ссылок нигде в вашем запросе:

stany_magazynowe, gk_grupy_produkty

Укажите СОЕДИНЕНИЕ для

продукты р И przyporzadkowania пр

и удалить

stany_magazynowe, gk_grupy_produkty

Подсказка: если вы не ссылаетесь на какие-либо столбцы из таблицы в вашем SELECT, ORDER BY, GROUP BY, WHERE, то таблица, вероятно, не входит в ваше предложение FROM. (Если это не таблица соединения / соединения.)

...