Aller au contenu

Plusieurs requetes dans un meme mysql_query


Sujets conseillés

Posté

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 ?!

Posté

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.

Posté (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é par zebulon
Posté

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.

Posté

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

Posté

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.

Posté

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

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...