2010-12-15 1 views
0

Я унаследовал сайт, который кто-то создал с использованием MySQL 4 в качестве базы данных, и я пытаюсь перейти на новый сервер с MySQL 5. Я скопировал все файлы и сбросил базу данных из MySQL версии 4, а затем импортировать обратно в версию 5.MySQL JOIN запрос работал в версии 4, разбитой на 5

Теперь половина веб-сайта работает, а другая половина - нет. Я получаю следующее:

Неизвестный столбца 'a.id_art' в 'на пункте'

Вот мой запрос:

SELECT *, aks.nazwa as sekcja, ak.nazwa kategoria 
FROM 
artykuly a, 
artykuly_kategorie ak, 
artykuly_sekcje aks 
LEFT JOIN artykuly_addons aad ON aad.id_art=a.id_art 
WHERE a.id_art = '20' AND ak.id_sek = aks.id_sek AND a.id_kat = ak.id_kat 

Почему выше отлично работает в версии MySQL 4, но сломанный человек в версии 5?

+1

Ну, `` id_art` существует в `artykuly`? – 2010-12-15 11:32:56

+0

Скорее всего, это связано с чем-то, что пошло не так во время передачи (дамп/перезагрузка), чем различия между версиями MySQL. Можете ли вы проверить, существуют ли все таблицы с одинаковыми столбцами? – Konerak 2010-12-15 11:41:21

ответ

2

Возможно, комбинация LEFT JOIN и соединение с запятыми и фильтрация в предложении WHERE вызывает проблему. Попробуйте следующее:

SELECT *, aks.nazwa as sekcja, ak.nazwa kategoria 
FROM 
artykuly a INNER JOIN artykuly_kategorie ak ON a.id_kat = ak.id_kat 
INNER JOIN artykuly_sekcje aks ON ak.id_sek = aks.id_sek 
LEFT JOIN artykuly_addons aad ON aad.id_art=a.id_art 
WHERE a.id_art = '20' 
0

Превалирование запятой теперь ниже, чем явные инструкции JOIN. Ссылаясь на MySQL 5.0 JOIN Syntax page:

Ранее оператор запятой (,) и РЕГИСТРИРУЙТЕСЬ оба имели один и тот же приоритет, поэтому присоединиться выражение t1, t2 РЕГИСТРИРУЙТЕСЬ t3 был интерпретирован как ((t1, t2) РЕГИСТРИРУЙТЕСЬ t3). Теперь РЕГИСТРИРУЙТЕСЬ имеет более высокий приоритет, поэтому выражение интерпретируется как (t1, (t2 РЕГИСТРИРУЙТЕСЬ t3))

Так, ранее это было трактовать как

SELECT *, 
    aks.nazwa as sekcja, 
    ak.nazwa kategoria 
FROM 
    (
     (
      artykuly a, 
      artykuly_kategorie ak0 
     ), 
     artykuly_sekcje aks 
    ) 
    LEFT JOIN artykuly_addons aad ON aad.id_art=a.id_art 
WHERE a.id_art = '20' 
    AND ak.id_sek = aks.id_sek 
    AND a.id_kat = ak.id_kat 

Теперь это интерпретируется как:

SELECT *, 
    aks.nazwa as sekcja, 
    ak.nazwa kategoria 
FROM 
    (
     (
      artykuly a, 
      artykuly_kategorie ak0 
     ), 
     (artykuly_sekcje aks LEFT JOIN artykuly_addons aad ON aad.id_art=a.id_art) 
    ) 
WHERE a.id_art = '20' 
    AND ak.id_sek = aks.id_sek 
    AND a.id_kat = ak.id_kat 
Смежные вопросы