Probleme de jointure innoDB

Répondre
LA GLOBULE
le 11/03/2008 à 11:54
LA GLOBULE
La doc MySQL dit :

Notez que les clés étrangères SQL sont utilisées pour assurer la cohérence des données, et non pas pour joindre des tables. Si vous voulez obtenir des résultats de tables multiples dans une commande SELECT, vous devez le faire avec une jointure.


Donc moi aussi j'ai un doute sur votre truc :)
Sammuel
le 11/03/2008 à 18:59
Sammuel
Concernant l'erreur SQL, c'est réglé ! J'ai oublié d'indiquer tous les éléments dans GROUP BY/ORDER.

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.nom,categorie_2.nom
ORDER BY categorie_1.nom,categorie_2.nom ASC


Cette requête, telle qu'elle, fonctionne mais elle me retourne un n'importe quoi smiley

Elle mélange les catégories 1 et 2. Et elle retourne le meme total pour toutes les catégories principales (categorie_1).

Si tu pouvais jeter un œil a tout ça, LupusMic, ce serait super sympa ! smiley
Sammuel
le 13/03/2008 à 18:48
Sammuel
Je n'ai toujours pas réussi a faire fonctionner la requête en faisant une jointure sur les clés étrangères des différentes tables. Je ne pense pas que ce soit possible d'ailleur !

Donc, je vais garder ma bonne vieille requête, le temps d'en trouver une meilleur smiley (la requête que j'utilisais sous MyISAM).
LupusMic
le 19/03/2008 à 05:57
LupusMic
(La Globule) Tu as raison en fait, la clé n'est pas utilisé pour la jointure :
+----+-------------+----------+-------+---------------+-----------+---------+------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+-----------+---------+------+------+----------------------------------------------+
| 1 | SIMPLE | voitures | index | NULL | modele_id | 5 | NULL | 1 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | modeles | ALL | NULL | NULL | NULL | NULL | 1 | |
| 1 | SIMPLE | marques | ALL | NULL | NULL | NULL | NULL | 1 | |
+----+-------------+----------+-------+---------------+-----------+---------+------+------+----------------------------------------------+


Je traduisais mal « on » :( mea culpa. Bref, il faut effectivement spécifier une condition complète.

select    marques.id as marque_id    , marques.marque as marque    , modeles.id as modele_id    , modeles.modele as modele    , count(voitures.id) as total from voitures left join modeles on voitures.modele_id = modeles.id     left join marques on modeles.marque_id = marques.id     group by marque, modele     order by marque, modele asc;


Avec le explain qui indique bien l'usage des clés :
+----+-------------+----------+--------+---------------+-----------+---------+-------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+--------+---------------+-----------+---------+-------------------------+------+----------------------------------------------+
| 1 | SIMPLE | voitures | index | NULL | modele_id | 5 | NULL | 1 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | modeles | eq_ref | PRIMARY | PRIMARY | 4 | test.voitures.modele_id | 1 | |
| 1 | SIMPLE | marques | eq_ref | PRIMARY | PRIMARY | 4 | test.modeles.marque_id | 1 | |
+----+-------------+----------+--------+---------------+-----------+---------+-------------------------+------+----------------------------------------------+
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours