zebulon Posté 21 Octobre 2009 Posté 21 Octobre 2009 Bonjour à tous, Voila, je souhaites faire une requête multiple en select. Dans l'idée, ce serait : (select1 UNION select2 UNION ... order by tri) UNION (selectenplus order by tri2) limit 100 Donc les select1,2,3... serait triées via le order by tri puis ajouté à la fin la requête selectplus pour plus de résultat. Est ce que quelqu'un à une idée ou plus ?!
jcaron Posté 21 Octobre 2009 Posté 21 Octobre 2009 C'est quoi la question? Comment ça s'écrit en SQL? />http://dev.mysql.com/doc/refman/5.1/en/union.html, la partie qui commence par "To use an ORDER BY or LIMIT clause to sort or limit the entire UNION result". Jacques.
zebulon Posté 22 Octobre 2009 Auteur Posté 22 Octobre 2009 (modifié) La question c'est comment faire un order by sur une série de UNION, PUIS faire un UNION avec une autre requête qui à son propre order by Mysql.com m'a bien aidé pour la première série d'UNION, ça, pas de problème. Mais comment y ajouter un autre select et faire tourner une requête de ce genre ((select1 UNION select2 UNION ... order by tri) UNION (selectenplus order by tri2)) limit 100 ??? (select id from table where clause=1) UNION (select id from table where clause=5)(...) order by tri asc UNION (select id from table where clause=9 order by tri2) limit 100 Là c'est pas expliqué dans la doc généraliste. Modifié 22 Octobre 2009 par zebulon
jcaron Posté 22 Octobre 2009 Posté 22 Octobre 2009 Si si, c'est dans la doc, vers la fin, à partir de "To cause rows in a UNION result to consist of the sets of rows retrieved by each SELECT one after the other"... Jacques.
zebulon Posté 22 Octobre 2009 Auteur Posté 22 Octobre 2009 Merci, mais regarde bien ce que je veux faire. Ce que tu me montre explique très bien la première partie de la "super-requête" mais aucunement la totalité. Ce qui est expliqué: (select id from table where clause=1) UNION (select id from table where clause=5)(...) order by tri asc limit 100 Ce que je cherche: (select id from table where clause=1) UNION (select id from table where clause=5)(...) order by tri asc UNION (select id from table where clause=9 order by tri2) limit 100 chocho Merci pour ton aide
jcaron Posté 22 Octobre 2009 Posté 22 Octobre 2009 Non, ils expliquent bien que si tu veux maintenir l'ordre de tri de chacun des bouts (en fait le reconstituer, puisque l'ordre est "perdu" par le UNION, et en fait complètement ignoré s'il n'y a pas de LIMIT dans les composantes), il faut que tu ajoutes (au moins) une autre colonne qui permet de mettre les bouts dans l'ordre dans le résultat final. Donc (ce qui est presque exactement le dernier exemple qu'ils donnent): (select 1 as tri_1,critere_de_tri_1 as tri_2,... from ... where ...) union (select 1 as tri_1,critere_de_tri_1 as tri_2,... from ... where ...) union (select select 2,critere_de_tri_2,... from ... where ....) order by tri_1,tri_2 limit 100 le tri_1 définit de quel "groupe" ça vient, le tri_2 l'ordre dans chaque groupe. Evidemment il est tout à fait possible suivant les colonnes disponibles et le tri exact que tu veux faire que tu n'aies pas besoin d'ajouter les deux colonnes en plus. En particulier, tu peux probablement écrire: (select 1 as tri_1,... from ... where ...) union (select 1 as tri_1,... from ... where ...) union (select select 2... from ... where ....) order by tri_1,case when tri_1=1 then critere_de_tri_1 else critere_de_tri_2 end limit 100 Jacques.
zebulon Posté 22 Octobre 2009 Auteur Posté 22 Octobre 2009 J'ai eu du mal mais tu m'as appris une chose superbe, la création de colonne à la volée, je ne connaissait pas ,c'est génial pour le tri dans ce cas là. Merci beaucoup pour ton aide et ta patience Jacques. Zebulon
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant