Probleme de jointure innoDB

Répondre
Sammuel
le 10/03/2008 à 01:31
Sammuel
Salut,

Désolé de vous déranger avec mes problèmes de requêtes, mais je n'arrive pas à en faire fonctionner une qui peut paraître toute simple ! Et j'aurais besoin de votre aide pour comprendre pourquoi cela ne veut pas fonctionner !

Ma BDD test se trouve ici :
http://www.lephpfacile.com/wall/wall-1520.php
... avec quelques enregistrements.

Quelques précisions :
La table categorie 3 liste toutes les sous catégories de la catégorie 2.
La table categorie 2 liste toutes les sous catégories de la catégorie 1.
La table categorie 1 liste toutes les catégories générales.

Chaque enregistrement de la categorie 2 appartient obligatoirement à une (et une seule) categorie 1.
Chaque enregistrement de la categorie 3 appartient obligatoirement à une (et une seule) categorie 2. Mais un enregistrement de la categorie_2 n'a pas forcément de lien avec la categorie_3 ! Donc un enregistrement de la categorie_2 peut ne pas avoir de sous catégorie (categorie_3).

Un article appartient obligatoirement à une categorie 2 et peut appartenir à une categorie 3.

Un article ayant un status égal à 0 signifie qu'il est activé. Si il est égal à 1, c'est qu'il est désactivé et qu'il ne sera pas pris en compte, afficher sur le net.

Ma requête actuelle... qui ne fonctionne pas :
SELECT categorie_1.nom AS categorie_1_nom,categorie_2.nom AS categorie_2_nom,COUNT(article.id) AS total
FROM article
LEFT JOIN categorie_3 ON article.categorie_3_id
LEFT JOIN categorie_2 ON article.categorie_2_id
LEFT JOIN categorie_1 ON categorie_2.categorie_1_id
WHERE article.status = '0'
GROUP BY categorie_1,categorie_2,categorie_3
ORDER BY categorie_1,categorie_2,categorie_3 ASC


J'ai essayé de m'inspirer de la requete de LupusMic qu'il m'a proposé dans mon précédent post, mais cela ne veut pas fonctionner.

J'ai l'impression que MYSQL n'arrive pas à faire le lien entre les tables !

Merci pour votre aide smiley
mojorisin
le 10/03/2008 à 07:54
mojorisin
Salut,
il te faut mettre une opérande pour tes jointures avec ON.
LEFT JOIN table2 ON table1.id=table2.fki_id

ou si les noms de colonne sont identiques dans chaque table utiliser le mot clé USING.
echo ’16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D4D465452snlbxq’|dc
Sammuel
le 10/03/2008 à 12:49
Sammuel
Non justement, normalement, je ne dois pas en avoir besoin, car j'utilise innoDB et donc avec les clé étrangères (FOREIGN KEY), les liens entre les tables devraient se faire automatiquement !

Sinon le problème n'est pas du au nom des colonnes ! car je les ai toutes rennomées en utilisant AS dans la requete. Et j'ai le meme probleme.
LA GLOBULE
le 10/03/2008 à 13:15
LA GLOBULE
Attention, les clés étrangères ne sont pas une conséquence de l'utilisation d'innoDB.

Tu les as créé comment tes clés étrangères ?

Et pour moi, tu dois quand même spécifier l'attribut sur lequel tu JOIN, ca parait logique. Sinon, avec ton raisonnement, tes tables seraient condamnées à joiner les autres que sur leurs clé primaire / étrangères.
Sammuel
le 10/03/2008 à 13:31
Sammuel
Voila comment j'ai procédé :

Au départ, toutes mes tables étaient de type MyISAM. J'ai donc :
* converti chaque table MyISAM en innoDB en faisant : "ALTER TABLE `nom_table` SET TYPE=InnoDB;"
* vidé toutes les tables
* exporté les structures de toutes les tables avant de les supprimer. Depuis le fichier SQL exporté, j'ai ajouté un FOREIGN KEY ou cela était necessaire.
* importé toutes les structures
* importé toutes les données
LA GLOBULE
le 10/03/2008 à 14:12
LA GLOBULE
Enfin bref, clés étrangères ou pas, tu dois spécifier les champs sur lesquels tu JOIN.
Sammuel
le 10/03/2008 à 14:42
Sammuel
Oki merci LA GLOBULE smiley

Donc, je n'ai pas a modifié les requetes que j'utilisais avec MyISAM !

Et, quand on utilises innoDB, c'est surtout coté MYSQL que ca change quelque chose. Ca ne change en rien aux requêtes que l'on utilisait sous MyISAM. Je vais continuer à me renseigner sur innoDB !
LupusMic
le 11/03/2008 à 06:55
LupusMic
(La Globule) Non, Lorsque les tables sont liées par des clés, tu indiques la clé primaire sur laquelle tu veux joindre.

Pour t'en convaincre, demande à explain ce qu'il en pense :)

(Sammuel) Ça veut dire quoi, « elle ne marche pas » ? Message d'erreurs ? Les données fournies ne sont pas celles attendues ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LA GLOBULE
le 11/03/2008 à 10:06
LA GLOBULE
LupusMic, cela m'intéresse : quand tu as une clé étrangère, tu peux te passer du ON ou du USING ? Comment MySQL comprend sur quel champ tu veux faire la jointure ? (rien ne m'oblige à faire une jointure sur une clé).
Sammuel
le 11/03/2008 à 11:47
Sammuel
LupusMic > Merci pour ta réponse ! Car j'avais un gros doute !

Sinon, la requete me retourne une erreur :
#1054 - Unknown column 'categorie_1' in 'order clause'

Pourtant, j'ai bien utilisé les clés étrangères pour lier les différentes tables ! Et je me suis basé sur la requête que tu m'avais indiqué sur mon autre post.
Répondre
LoadingChargement en cours