Trier avec union

Trier avec union - SQL/NoSQL - Programmation

Marsh Posté le 18-07-2014 à 15:30:20    

Bonsoir à tous,
 
Je fais la requete suivante :
 

Code :
  1. (SELECT numpage, titre FROM NEW_Pages WHERE  titre LIKE '%machin%' ORDER BY titre)
  2. UNION
  3. (SELECT numpage, titre FROM NEW_Pages WHERE contenu LIKE '%machin%' ORDER BY titre);


 
Le but étant que si le mot est dans le titre, le résultat soit avant que si le mot est dans le contenu, mais qu'il y ait quand même deux ordres alphabétiques (je sais pas si je suis clair :D)
 
Pas d'erreur mais les résultats sont triés par ID...
 
Une idée ?


Message édité par zezette le 18-07-2014 à 15:33:23

---------------
"Par moment j'me d'mande si chui pas con" G. de Suresnes
Reply

Marsh Posté le 18-07-2014 à 15:30:20   

Reply

Marsh Posté le 18-07-2014 à 16:06:50    

suffit de faire  
 
select numpage, titre from  
((SELECT numpage, titre FROM NEW_Pages WHERE  titre LIKE '%machin%' )
 UNION
(SELECT numpage, titre FROM NEW_Pages WHERE contenu LIKE '%machin%' )) a
order by titre;

Reply

Marsh Posté le 18-07-2014 à 16:08:52    

il te suffit de trier ton union sur le champ titre
(SELECT  'U1', numpage, titre FROM NEW_Pages WHERE  titre LIKE '%machin%' ORDER BY titre)
UNION
(SELECT 'U2', numpage, titre FROM NEW_Pages WHERE contenu LIKE '%machin%' ORDER BY titre)
ORDER By titre  
 
:)
 
Guillaume


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 18-07-2014 à 16:11:00    

Je viens de voir que j'ai posté plus tardivement que ddr555 ...
sur As400, on a pas besoin de faire ce que tu fais ddr555 :)


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 18-07-2014 à 16:12:53    

tu es archéologue ? :D
 
moi c'est en oracle

Reply

Marsh Posté le 18-07-2014 à 19:39:55    

J'ai plutot l'impression que la demande c'est d'avoir tous les resultats de la premiere requete, tries entre eux, puis ceux de la seconde, tries entre eux.
 
Si c'est ca, dans la requete du premier poste, il suffit de changer le UNION (qui trie et enleve les lignes en double) en UNION ALL (qui se contente de tout mettre a la suite sans chercher a comprendre):

(SELECT numpage, titre FROM NEW_Pages WHERE  titre LIKE '%machin%' ORDER BY titre)
UNION ALL
(SELECT numpage, titre FROM NEW_Pages WHERE contenu LIKE '%machin%' ORDER BY titre);

 
 
Autre option, si on veut garder le UNION a tout prix:

SELECT numpage, titre
FROM (
    (SELECT numpage, titre, 1 AS ordre FROM NEW_Pages WHERE  titre LIKE '%machin%')
    UNION ALL
    (SELECT numpage, titre, 2 AS ordre FROM NEW_Pages WHERE contenu LIKE '%machin%'))
ORDER BY ordre, titre;

 
 
EDIT: en fait non car je suppose qu'il faut quand meme virer les resultats doubles. Du coup un truc comme ca?

SELECT numpage, titre
FROM (
    SELECT num_page, titre, MIN(ordre) AS ordre
    FROM (    
        SELECT numpage, titre, 1 AS ordre FROM NEW_Pages WHERE  titre LIKE '%machin%'
        UNION ALL
        SELECT numpage, titre, 2 AS ordre FROM NEW_Pages WHERE contenu LIKE '%machin%')
    )
    GROUP BY num_page, titre
)
ORDER BY ordre, titre);

 
RE-EDIT: fix des parentheses :o


Message édité par lasnoufle le 18-07-2014 à 19:54:20

---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 18-07-2014 à 20:09:15    

Oui en effet, je veux les résultats de la première triés suivis des résultats de la secondes triés eux aussi et pas les resultats des 2 ensembles et triés. Les doublons, j'y avais pas pensé mais en effet, je les veux pas :)
 
Je teste ça mardi :)
 
Merci en tous cas


Message édité par zezette le 18-07-2014 à 20:11:29

---------------
"Par moment j'me d'mande si chui pas con" G. de Suresnes
Reply

Marsh Posté le 24-07-2014 à 12:49:28    

J'ai testé avec le union all (tant pis pour les doublons) mais ça ne marche pas :( c'est toujours trié sur la clé primaire plutôt que sur le titre


---------------
"Par moment j'me d'mande si chui pas con" G. de Suresnes
Reply

Marsh Posté le 24-07-2014 à 21:23:44    

zezette ton order by n'est pas au bon endroit:

 

(select1
union
select2)
order by titre...

 

je ne sais même pas si les orders by dans les unions servent à quelques choses...à voir :)

 

Guillaume


Message édité par gpl73 le 24-07-2014 à 21:24:24

---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 25-07-2014 à 09:48:10    

Ca, ça trie bien par ordre alphabétique mais résultats du select 1 et 2 mélangés. Le but ici est de trier le select1 et d'y coller les résultats du select2 sans les doublons qui seraient déjà dans le select1.
 
J'essaie la 2e solution de lasnoufle


Message édité par zezette le 25-07-2014 à 10:04:54

---------------
"Par moment j'me d'mande si chui pas con" G. de Suresnes
Reply

Marsh Posté le 25-07-2014 à 09:48:10   

Reply

Marsh Posté le 25-07-2014 à 10:04:39    

J'ai donc testé la 2e solution de lasnoufle un peu modifiée car il y a une erreur :
 

Code :
  1. SELECT numpage, titre, ordre
  2. FROM (
  3.     (SELECT numpage, titre, 1 AS ordre FROM NEW_Pages WHERE  titre LIKE '%machin%')
  4.     UNION
  5.     (SELECT numpage, titre, 2 AS ordre FROM NEW_Pages WHERE contenu LIKE '%machin%')) AS tabletemporaire
  6. ORDER BY ordre, titre;


 
Ca marche, les résultats sont triés comme je veux, mais... il y a des doublons :(


Message édité par zezette le 25-07-2014 à 10:05:24

---------------
"Par moment j'me d'mande si chui pas con" G. de Suresnes
Reply

Marsh Posté le 25-07-2014 à 10:15:18    

J'ai trouvé :)
 

Code :
  1. SELECT DISTINCT numpage, titre
  2. FROM (
  3.     (SELECT numpage, titre, 1 AS ordre FROM NEW_Pages WHERE  titre LIKE '%machin%')
  4.     UNION
  5.     (SELECT numpage, titre, 2 AS ordre FROM NEW_Pages WHERE contenu LIKE '%machin%')) AS tabletemporaire
  6. ORDER BY ordre, titre;


 
Merci à tous pour votre assistance :)


---------------
"Par moment j'me d'mande si chui pas con" G. de Suresnes
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed