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

Requêtes MySQL Discussion :

GROUP BY sur requête UNION


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 12
    Points : 13
    Points
    13
    Par défaut GROUP BY sur requête UNION
    Bonsoir,

    Encore avec un problème sur requète UNION.

    J'ai une requète UNION sur 2 tables et je liste bien les résultats.

    Maintenant je souhaiterai dédoublonner les résultats issus des 2 tables.
    Je m'explique : j'ai une table deviscomplet et une autre devis express, la requète UNION me permet d'afficher les devis des 2 tables en les classant par date. Maintenant je souhaiterai dédoublonner le résultat des requères car certaines personnes remplissent le deviscomplet et le devisexpress.

    (SELECT nom,date FROM deviscomplet) UNION ALL (SELECT nom,date FROM devisexpress) ORDER BY date DESC LIMIT 100

    Si je met GROUP BY nom juste avant ORDER BY j'ai une erreur

    (SELECT nom,date FROM deviscomplet GROUP BY nom) UNION ALL (SELECT nom,date FROM devisexpress GROUP BY nom) ORDER BY date DESC LIMIT 100
    Là je dedoublonne bien mais sur chaque table, si quelqu'un à remplis le devis express et le complet je n'arrive pas à dédoublonner.

    Existe-il une fonction qui dédouble sur deux table ?

    Merci d'avance pour votre temps.
    Merci pour votre aide ;-)

  2. #2
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    "UNION" retire déjà les doublons, contrairement à "UNION ALL"

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 12
    Points : 13
    Points
    13
    Par défaut Pas de changement
    Avec UNION ou UNION ALL, j'ai toujours les doublons.

    Seule la requète suivante enlève les doublons d'une même table mais pas ceux commun aux deux tables.

    (SELECT nom,date FROM deviscomplet GROUP BY nom) UNION ALL (SELECT nom,date FROM devisexpress GROUP BY nom) ORDER BY date DESC LIMIT 100

    Je pense qu'il est possible de créer une table temporaire avec les résultat de cette requète afin de dédoublonner avec GROUP BY, mais je n'ai pas la syntaxe pour la créer.

    Quelqu'un à un exemple de création et insertion dans une table temporaire ?
    Merci pour votre aide ;-)

  4. #4
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Dans ce cas, avec un MySQL assez récent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM (SELECT nom,date FROM deviscomplet UNION ALL SELECT nom, date FROM devisexpress) as tmp group by nom
    Mais il ne s'agit pas de doublons dans la mesure où les couples (nom, date) sont uniques. En outre lister la date avec un "GROUP BY nom" est problématique car cela va renvoyer une des dates associées au nom sans que l'on sache laquelle. Or, s'il y avait des "doublons" c'est bien que les dates étaient différentes.

    Sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom, date FROM devisexpress
    pourrait devenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom, date FROM devisexpress WHERE nom NOT IN (SELECT nom FROM deviscomplet)

  5. #5
    Membre régulier Avatar de jp_rennes
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2006
    Messages : 72
    Points : 86
    Points
    86
    Par défaut
    Quand on dit que union retire les doublons, il retire les lignes identiques.
    Si par exemple dans ta table tu as plusieurs fois le même nom mais avec des dates différentes les lignes sont différentes

    Dans ta requête (SELECT nom,date FROM deviscomplet GROUP BY nom) UNION ALL (SELECT nom,date FROM devisexpress GROUP BY nom) ORDER BY date DESC LIMIT 100 tu ne fais que récupérer une fois chaque client et en face une date et je ne suis pas sûr que se soit ce que tu cherches....

    exemple :
    mysql> select * from nom;
    +------+------------+
    | nom | date |
    +------+------------+
    | aaaa | 2005-12-06 |
    | aaaa | 2006-12-06 |
    | aaaa | 2007-12-06 |
    | aaaa | 2006-12-06 |
    | aaaa | 2007-12-06 |
    +------+------------+
    5 rows in set (0.00 sec)

    mysql> select nom,date from nom group by nom;
    +------+------------+
    | nom | date |
    +------+------------+
    | aaaa | 2005-12-06 |
    +------+------------+
    1 row in set (0.00 sec)

    Pour résumer le union retire les vrais doublons c'est à dire même nom et même date...

    Pour plus d'infos sur union va voir http://dev.mysql.com/doc/refman/5.0/en/union.html

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 12
    Points : 13
    Points
    13
    Par défaut Problème résolu
    Merci à Sivrît pour ton aide précieuse qui m'a permit de faire cette requète un peu tordu.

    Merci à jp_rennes pour tes complément d'infos.

    Pour faire avancer les choses voici la requète finale qui dédoublonne bien sur les 2 tables :

    SELECT * FROM (SELECT nom,date FROM deviscomplet) UNION ALL (SELECT nom,date FROM devisexpress)AS tmp GROUP BY nom ORDER BY date DESC LIMIT 100

    Merci pour votre aide.
    Merci pour votre aide ;-)

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Bonjour, dsl je fait remonté un post assez vieux mais il y a pas plus recent sur le sujet de mon problème. En effet je désire faire un GROUP BY dans un requête d'UNION mais j'ai une erreur que je n'arrive pas a adapté a ma requête.

    quand je fait un :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ( select DISTINCT A.*, B*, C.*
    FROM (A)  
    LEFT JOIN B 	 	ON A.nom=B.nom
    LEFT JOIN C 	 	ON A.id=C.id 
    )
    UNION ( select DISTINCT A.*, B*, C.*
    FROM (A)  
    LEFT JOIN B 	 	ON A.nom=B.nom
    LEFT JOIN C 	 	ON A.id=C.id 
    WHERE ..
    )
    ça me donne bien l'union des résultats, mais quand il y a un résultat qui satisfait les deux select, j'ai deux fois la même ligne. Alors d'apres les messages precedents j'ai fait une requete comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select * FROM (( select DISTINCT A.*, B*, C.*
    FROM (A)  
    LEFT JOIN B 	 	ON A.nom=B.nom
    LEFT JOIN C 	 	ON A.id=C.id 
    )
    UNION ( select DISTINCT A.*, B*, C.*
    FROM (A)  
    LEFT JOIN B 	 	ON A.nom=B.nom
    LEFT JOIN C 	 	ON A.id=C.id 
    WHERE ..
    )) as tmp group by nom
    J'ai une erreur, Duplicate column name sur un champs d'une de mes tables. J'arrive pas a comprendre cette erreur dans mon contexte. pourtant j'ai le même select pour les deux requete de l'UNION. Merci de me donnée votre expertise.

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

Discussions similaires

  1. Doublon sur requête UNION
    Par miine dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/10/2014, 12h53
  2. [AC-2007] Problème sur requête Union
    Par manusp dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/02/2012, 15h17
  3. [WD16] Sous-Requête sur Requête UNION
    Par JustineJ dans le forum WinDev
    Réponses: 1
    Dernier message: 11/08/2011, 13h08
  4. Critère sur requête union
    Par MelaAllIn dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 04/11/2009, 15h24
  5. [Optimisation] Problème sur une requête UNION.
    Par françois62 dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/06/2005, 16h08

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