2010-12-15 47 views
0

J'ai hérité d'un site web construit par quelqu'un d'autre en utilisant MySQL 4 comme base de données et j'essaie de passer à un nouveau serveur, en exécutant MySQL 5. J'ai copié tous les fichiers la base de données à partir de MySQL version 4, puis réimporté dans la version 5.La requête MySQL JOIN fonctionnait en version 4, cassée 5

Maintenant, la moitié du site fonctionne, tandis que l'autre moitié ne fonctionne pas. Je continue à obtenir les éléments suivants:

Unknown column 'a.id_art' dans 'sur la clause'

Voici ma question:

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 

Pourquoi l'amende de travail ci-dessus dans la version MySQL 4 mais est un homme brisé dans la version 5?

+1

Eh bien, est-ce que 'id_art' existe dans' artykuly'? –

+0

Cela est plus susceptible d'être lié à quelque chose qui s'est mal passé pendant le transfert (dump/reload) que les différences entre les versions de MySQL. Pouvez-vous vérifier si toutes les tables existent, avec les mêmes colonnes en premier? – Konerak

+0

toutes les tables existent aussi quand je vérifie id_art = '20 'il y a un tel article dans la base de données – Cfaniak

Répondre

2

Probablement la combinaison de LEFT JOIN et la jointure avec des virgules et le filtrage dans la clause WHERE provoque le problème. Essayez ceci:

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

+1 pour plus de détails, voir http://dev.mysql.com/doc/refman/5.1/fr/join.html, section" Rejoindre les modifications de traitement dans MySQL 5.0 .12 " –

0

La précédence de la virgule est maintenant inférieure aux instructions JOIN explicites. Citant le MySQL 5.0 JOIN Syntax page:

Auparavant, l'opérateur virgule (,) et JOIN avaient tous deux la même priorité, de sorte que la jointure expression t1, t2 REJOIGNEZ t3 a été interprété comme ((t1, t2) REJOIGNEZ t3). Maintenant JOIN a une priorité plus élevée, de sorte que l'expression est interprété comme (t1, (t2 REJOIGNEZ-t3))

PRECEDEMMENT cela a été traité comme

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 

Maintenant, il est interprété comme:

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