IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Trier le résultat global sur une requête avec UNION ALL


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de monlou
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2010
    Messages : 363
    Points : 144
    Points
    144
    Par défaut Trier le résultat global sur une requête avec UNION ALL
    Bonjour,
    est-il possible de trier un résultat combiné de 2 requetes UNION ?
    pour l'instant mes requetes trie seulement le résultat d'une requete des 2
    et affiche les résultats séparéments.
    c.a.d le resultat de la premeire requete sans tri et le résultat triés de la deuxiene requete en ordre id asc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <?php
    $sqlMessagesHistorique = "((SELECT id, membreID, pseudo, pseudoDestinataire,
    				idDestinataire, DATE_FORMAT(date, '%d/%m/%Y %H:%i') AS date_message, message, repondu
    			FROM me	
    				WHERE membreID ='".htmlentities($idEnvoyeur)."' AND idDestinataire = '".$membreConnecte."' 
    				AND (repondu =1 OR repondu =2))
     
    			UNION ALL		
     
    			(SELECT id, membreID, pseudo, pseudoDestinataire,
    				idDestinataire, DATE_FORMAT(date, '%d/%m/%Y %H:%i') AS date_message, message, repondu
    			FROM me AS me2	
    				WHERE membreID ='".$membreConnecte."' AND idDestinataire = '".htmlentities($idEnvoyeur)."'
    				AND (repondu =1 OR repondu =2 OR repondu =0))
     
    			)	
    				ORDER BY id ASC )";	
    ?>
    Ils ne savaient pas que c'était impossible, alors ils l'ont fait!
    Mark Twain.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 232
    Points : 12 846
    Points
    12 846
    Par défaut
    Bonjour,
    Pourquoi ne pas regrouper les deux requêtes en une seule ?
    Les deux tapent sur la même table, seuls les critères de recherche diffèrent.

    Sinon il suffit de faire un SELECT qui "englobe" les deux requêtes, et d'ajouter un ORDER BY.

    Tatayo.

  3. #3
    Membre habitué Avatar de monlou
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2010
    Messages : 363
    Points : 144
    Points
    144
    Par défaut
    Bonjour Tatayo,
    Bonjour,
    Pourquoi ne pas regrouper les deux requêtes en une seule ?
    Les deux tapent sur la même table, seuls les critères de recherche diffèrent.
    C'est bien ce que je voulais faire avec ma requete UNION ALL
    mais je me rends compte que ca tri les requêtes séparément.

    regrouper les 2 requêtes en une seule avec UNION ALL, je pense a group by

    sinon écrire une requete conjointe ?

    c'est comment la meilleure facon de regrouper les 2 requêtes qui ont des conditions différents ?
    Ils ne savaient pas que c'était impossible, alors ils l'ont fait!
    Mark Twain.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 232
    Points : 12 846
    Points
    12 846
    Par défaut
    Citation Envoyé par monlou Voir le message
    c'est comment la meilleure facon de regrouper les 2 requêtes qui ont des conditions différents ?
    En joignant les deux conditions, avec un OR entre les deux, tout simplement.:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select col1,col2 from table1 where col1=X
    union all
    select col1,col2 from table1 where col1=Y and col2=Z
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select col1,col2 from table1 where (col1=X) or (col1=Y and col2=Z)
    Un GROUP BY sert à appliquer des fonctions d'agrégation (MIN,MAX), non à fusionner des requêtes.
    Tatayo.

  5. #5
    Membre habitué Avatar de monlou
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2010
    Messages : 363
    Points : 144
    Points
    144
    Par défaut
    je te remercie de plein coeur pour m'avoir aider a raisonner et résoudre ce problème Tatayo

    la solution de la requête avec les deux WHERE unis par un OR semble la meilleure solution !
    Ils ne savaient pas que c'était impossible, alors ils l'ont fait!
    Mark Twain.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Il y a quand même de grande chance que la requête avec le UNION ALL soit la plus rapide, en fonction des index qui existent sur votre table.
    Les SGBD n'optimisent pas toujours très bien les requêtes avec des OR.

    Pour votre problème de tri, c'est que vous avez mis trop de parenthèses :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    $sqlMessagesHistorique = "SELECT id, membreID, pseudo, pseudoDestinataire,
    				idDestinataire, DATE_FORMAT(date, '%d/%m/%Y %H:%i') AS date_message, message, repondu
    			FROM me	
    				WHERE membreID ='".htmlentities($idEnvoyeur)."' AND idDestinataire = '".$membreConnecte."' 
    				AND repondu IN (1,2)
     
    			UNION ALL		
     
    			SELECT id, membreID, pseudo, pseudoDestinataire,
    				idDestinataire, DATE_FORMAT(date, '%d/%m/%Y %H:%i') AS date_message, message, repondu
    			FROM me
    				WHERE membreID ='".$membreConnecte."' AND idDestinataire = '".htmlentities($idEnvoyeur)."'
    				AND repondu IN (0,1,2)
    
    			ORDER BY id ASC";	
    ?>

  7. #7
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 58
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    Sans réfléchir sur la bonne manière de rédiger la requête, qui dépend beaucoup du SGBD, de la base et de ces index on peut faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM (ma requête en union) ORDER BY MONCHAMP

  8. #8
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    C'est inutile, Waldar a répondu au problème de tri et le order by s'applique bien à l'union.
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimisation d'une requête avec UNION ALL
    Par jgfa9 dans le forum Requêtes
    Réponses: 11
    Dernier message: 01/08/2012, 21h53
  2. [UNION] - Perte de résultat sur une requête avec UNION
    Par lecail65 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/09/2009, 14h30
  3. [SQL] Erreur sur une requète avec un Like
    Par heruwenli dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 30/05/2007, 14h29
  4. Réponses: 5
    Dernier message: 06/01/2007, 04h48
  5. [VBA] Erreur sur une requête avec un opérateur
    Par elgringo2007 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/07/2006, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo