[MySQL] left join + group by : lequel il prend ?

5 réponses
AuteurMessage

Rano |
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 10/04/2006 à 18:52

Salut,

J'ai un requete de ce style :

SELECT A.truc, MAX(B.date), B.nom
FROM A
LEFT JOIN B
ON A.a = B.b
GROUP BY A.id
ORDER BY A.truc

Seulement il me prend B.date et B.nom dans deux enregistrements différents... On peut pas lui dire de prendre le B.nom qui correspond au B.date trouvé ?

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 10/04/2006 à 19:01

En fait ce genre de requete est en théorie "fausse". MySQL le tolère, mais le "B.nom" est évidement totalement alléatoire.

La solution la plus simple est de passer par 2 requêtes distinctes. Dans la doc de MySQL ils expliquent également une bidouille à base de "padding", "concat" puis de "substr", mais ce n'est pas très "propre"

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 10/04/2006 à 19:06

Bon, j'ai fini par tomber sur cette page :
http://dev.mysql.com/doc/refman/5.0/en/example-max...Ouvrir dans une nouvelle fenetre

Je l'ai prise et déclinée pour ajouter ca dans le WHERE et ca fonctionne :

WHERE (B.nom IS NULL OR (
B.id = (SELECT MAX(B2.id) FROM B AS B2)
))

Et du coup, juste B.date au lieu de Max(b.date) dans le select...

Oui c'est tiré par les cheveux, mais ca s'éxécute vite et sur une page vue peut etre 10 fois par jour, donc c'est bon

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 10/04/2006 à 19:11

bah tu fais quand même 2 requêtes

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 10/04/2006 à 19:13

Tiens d'ailleurs dans la version FrançaiseOuvrir dans une nouvelle fenetre ils ont laissé la bidouille :

SELECT article,
SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'), dealer) ), 7) AS dealer,
0.00+LEFT( MAX( CONCAT(LPAD(price,6,'0'), dealer) ), 6) AS price
FROM shop
GROUP BY article;

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 10/04/2006 à 19:39

c'est violent ^

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 24/11/2024 3:19:57 | Généré en 9.27ms | Contacts | Mentions légales |