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 :

Requête union avec critères


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut Requête union avec critères
    Bonjour,


    J'ai une requête UNION à laquelle j'aimerai rajouter des critères.
    Mais les critères de recherches ne sont pas affectés.

    Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Select nom, prenom
    from
    collegien
    where idcollegien <> 0
     
    union
    Select nom, prenom
    from
    lyceen 
    where idlyceen <> 0
     
    where nom > "D"
    AND prenom < "B"
    pourquoi mon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where nom > "D"
    AND prenom < "B"
    ne fonctionne pas?

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 037
    Points : 23 784
    Points
    23 784
    Par défaut
    Parce qu'il faut le répéter dans chaque requête.
    Ou alors, il faut passer par une sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT nom, prenom
    FROM (
        SELECT nom, prenom
        FROM collegien
        WHERE idcollegien <> 0
        UNION 
        SELECT nom, prenom
        FROM lyceen 
        WHERE idlyceen <> 0
    ) t
    WHERE nom > 'D'
    AND prenom < 'B'
    Seul le ORDER BY s'applique à l'ensemble des lignes retournées par UNION.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Ok mais j'ai pas les mêmes noms de champs dans mes tables, j'utilise des alias...comment faire dans ce cas?

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 037
    Points : 23 784
    Points
    23 784
    Par défaut
    Mets les mêmes alias dans les 2 requêtes réunies par l'union :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT nom, prenom
    FROM (
        SELECT champ1 AS nom, champ2 AS prenom
        FROM collegien
        WHERE idcollegien <> 0
        UNION 
        SELECT champ3 AS nom, champ4 AS prenom
        FROM lyceen 
        WHERE idlyceen <> 0
    ) t
    WHERE nom > 'D'
    AND prenom < 'B'
    Voilà pourquoi on préfère avoir le schéma des tables avant de répondre à une question , ça permet de répondre plus efficacement du premier coup.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    OK Merci!
    Je vais tester!

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Alors ça ne fonctionne pas je place ici ma requête

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    SELECT
    IDMaintenance,
    IDService,
    IDUtilisateur,
    IDClient,
    Date,
    HeureDeb,
    ARappelerIDService,
    ARappelerIDUtilisateur,
    Client,
    AgenceCommerciale,
    Interlocuteur,
    DECODE(Client.Activite,'SAP','Service à la personne','INT','Intérim','RH','Ressources humaines','AUT','Autres','') AS Activite,	
    Utilisateur,
    Service,
    ARappeler,
    AppelObjet,
    Probleme,
    Solution
    FROM (SELECT
    Appel.IDAppel																					AS IDMaintenance,
    Appel.IDService																					AS IDService,
    Appel.IDUtilisateur																				AS IDUtilisateur,
    Appel.IDClient																					AS IDClient,
    Appel.Date																						AS Date,
    Appel.HeureDeb																					AS HeureDeb,
    Appel.ARappelerIDService																		AS ARappelerIDService,
    Appel.ARappelerIDUtilisateur																	AS ARappelerIDUtilisateur,
    Client.RaisonSociale																			AS Client,
    AgenceCommerciale.RaisonSociale																	AS AgenceCommerciale,
    Appel.Interlocuteur																				AS Interlocuteur,
    DECODE(Client.Activite,'SAP','Service à la personne','INT','Intérim','RH','Ressources humaines','AUT','Autres','') AS Activite																								,	
    Utilisateur.NomPrenom																			AS Utilisateur,
    Service.Designation																				AS Service,
    Appel.ARappeler																					AS ARappeler,
    AppelObjet.Designation																			AS AppelObjet,
    AppelDetail.Probleme																			AS Probleme,
    AppelDetail.Solution																			AS Solution
     
    FROM
    Appel
    Left OUTER JOIN Client on (Appel.IDClient = Client.IDClient) 
    Left outer join DepartementActivite on (Client.NumDepartement = DepartementActivite.NumDepartement AND Client.Activite = DepartementActivite.Activite) 
    Left outer join AgenceCommerciale on (DepartementActivite.IDAgenceCommerciale = AgenceCommerciale.IDAgenceCommerciale)
    LEFT JOIN Salarie ON Salarie.IDUtilisateur = Appel.IDUtilisateur, Utilisateur LEFT JOIN Salarie ON Salarie.IDUtilisateur = Utilisateur.IDUtilisateur
    Left OUTER JOIN service on (Appel.IDService = Service.IDService) 
     		LEFT JOIN AppelDetail ON Appel.IDAppel = AppelDetail.IDAppel
     		Left JOIN AppelObjet on AppelDetail.IDAppelObjet = AppelObjet.IDAppelObjet
    WHERE
    Appel.IDAppel <> 0 UNION SELECT
    Mail.IDMail																						AS IDMaintenance,
    Mail.S_IDService																				AS IDService,
    Mail.S_IDUtilisateur																			AS IDUtilisateur,
    Mail.E_IDClient																					AS IDClient,
    Mail.E_Date																						AS Date,
    Mail.E_Heure																					AS HeureDeb,
    Mail.ARappelerIDService																			AS ARappelerIDService,
    Mail.ARappelerIDUtilisateur																		AS ARappelerIDUtilisateur,
    Client.RaisonSociale																			AS Client,
    AgenceCommerciale.RaisonSociale																	AS AgenceCommerciale,
    Mail.E_Interlocuteur																			AS Interlocuteur,
    DECODE(Client.Activite,'SAP','Service à la personne','INT','Intérim','RH','Ressources humaines','AUT','Autres','') AS Activite																								,	
    Utilisateur.NomPrenom																			AS Utilisateur,
    Service.Designation																				AS Service,
    Mail.ARappeler																					AS ARappeler,
    AppelObjet.Designation																			AS AppelObjet,
    MailDetail.Probleme																				AS Probleme,
    MailDetail.Solution																				AS Solution
     
    FROM
    Mail
    Left OUTER JOIN Client on (Mail.E_IDClient = Client.IDClient) 
    Left outer join DepartementActivite on (Client.NumDepartement = DepartementActivite.NumDepartement AND Client.Activite = DepartementActivite.Activite) 
    Left outer join AgenceCommerciale on (DepartementActivite.IDAgenceCommerciale = AgenceCommerciale.IDAgenceCommerciale)
    Left JOIN Salarie on Salarie.IDUtilisateur = Mail.S_IDUtilisateur, Utilisateur Left JOIN Salarie on Salarie.IDUtilisateur = Utilisateur.IDUtilisateur
    Left OUTER JOIN Service on (Mail.S_IDService = Service.IDService) 
    Left JOIN MailDetail on Mail.IDMail = MailDetail.IDMail
    Left JOIN AppelObjet on MailDetail.IDAppelObjet = AppelObjet.IDAppelObjet
    WHERE
    Mail.IDMail <> 0
     ) Maintenance 
     Where Date BETWEEN '20110101' AND '20111231'
    Voici le message d'erreur que j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le fichier Client n'existe pas dans la clause From
    Merci d'avance pour votre aide...

  7. #7
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    C'est quoi ces noms de colonnes dans les sub-select qui ne sont pas séparés par des virgules ?

  8. #8
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    déjà essaye de mettre les requêtes dans tes union entre parenthèse:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select t.nom,t.prenom from (
     (select .... as nom, as prenom)
    union
     (select...)
     
    ) t WHERE nom > "D"
    AND prenom < "B"

    car il se peut que tu aies des problèmes de résolution de nom de table ou colonne

    quand tu fais des union le nom des colonnes résultantes est par défaut celui des colonnes de la 1ère table, pas la peine de le faire dans le(s) autre(s)

    quand tu fais un from sur une sous requête TU DOIS SURNOMMER LA SOUS REQUETE !

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Je ne sais pas pourquoi ta première requête parlait de collégiens et de lycéens alors que la vraie requête n'a rien à voir mais bon...

    Ouch ! Elle fait mal aux yeux ta requête !

    1) La colonne "date" ne devrait pas s'appeler ainsi car c'est un mot réservé du langage SQL.

    2) Inutile de faire des alias quand tu reprends exactement le nom de la colonne.

    3) L'utilisation d'alias court pour les tables rend l'écriture et la lecture de la requête plus facile

    4) Indente tes requêtes pour pouvoir les lire, et nous les faire lire, plus facilement.

    5) La table User semble ne pas être jointe au reste car il n'y a pas de condition de jointure dans le WHERE. D'ailleurs les jointures ne se font plus ainsi depuis 1992 ! Puisque tu utilises LEFT OUTER JOIN, utilise aussi INNER JOIN !

    Mais apparemment, le chemin des jointures est celui-ci :
    Appel->Client->DepartementActivite->AgenceCommerciale
    |-------->Salarie->Utilisateur
    |-------->Service
    |-------->AppelDetail->AppelObjet

    Donc il s'agit d'une jointure externe de Salarie vers Utilisateur

    6) Le format de date standard en SQL est 'aaaa-mm-jj'
    La colonne mal nommée "date" est-elle de type DATE ?

    7) Comme tu as déjà fait un DECODE dans les sous-requêtes, il me semble inutile de le refaire dans la requête générale.
    Ou alors fais le dans la requête générale et pas dans les sous-requêtes !

    8) Bizarre que la jointure de MailDetail soit avec AppelObjet !

    Normalement, ta requête devrait plutôt ressembler à ça :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    SELECT
        tmp.IDMaintenance,
        tmp.IDService,
        tmp.IDUtilisateur,
        tmp.IDClient,
        tmp.`Date`,
        tmp.HeureDeb,
        tmp.ARappelerIDService,
        tmp.ARappelerIDUtilisateur,
        tmp.Client,
        tmp.AgenceCommerciale,
        tmp.Interlocuteur,
        tmp.Activite,    
        tmp.Utilisateur,
        tmp.Service,
        tmp.ARappeler,
        tmp.AppelObjet,
        tmp.Probleme,
        tmp.Solution
    FROM 
    (
        SELECT
            a.IDAppel AS IDMaintenance,
            a.IDService,
            a.IDUtilisateur,
            a.IDClient,
            a.`Date`,
            a.HeureDeb,
            a.ARappelerIDService,
            a.ARappelerIDUtilisateur,
            c.RaisonSociale AS Client,
            ac.RaisonSociale AS AgenceCommerciale,
            a.Interlocuteur,
            DECODE(c.Activite, 'SAP', 'Service à la personne', 'INT', 'Intérim', 'RH', 'Ressources humaines', 'AUT', 'Autres', '') AS Activite                                                                                                ,    
            u.NomPrenom AS Utilisateur,
            sv.Designation AS Service,
            a.ARappeler,
            ao.Designation AS AppelObjet,
            ad.Probleme,
            ad.Solution
        FROM Appel a
        LEFT OUTER JOIN Client c ON a.IDClient = c.IDClient 
            LEFT OUTER JOIN DepartementActivite da
                    ON c.NumDepartement = da.NumDepartement 
                    AND c.Activite = da.Activite 
                LEFT OUTER JOIN AgenceCommerciale ac ON da.IDAgenceCommerciale = ac.IDAgenceCommerciale
        LEFT JOIN Salarie s ON s.IDUtilisateur = a.IDUtilisateur
            LEFT JOIN Utilisateur u ON u.IDUtilisateur = sl.IDUtilisateur
        LEFT OUTER JOIN service sv ON a.IDService = sv.IDService 
         LEFT JOIN AppelDetail ad ON a.IDAppel = ad.IDAppel
            LEFT JOIN AppelObjet ao ON ad.IDAppelObjet = ao.IDAppelObjet
        WHERE a.IDAppel <> 0 
     
        UNION 
     
        SELECT
            m.IDMail AS IDMaintenance,
            m.S_IDService AS IDService,
            m.S_IDUtilisateur AS IDUtilisateur,
            m.E_IDClient AS IDClient,
            m.E_Date AS Date,
            m.E_Heure AS HeureDeb,
            m.ARappelerIDService,
            m.ARappelerIDUtilisateur,
            c.RaisonSociale AS Client,
            ac.RaisonSociale AS AgenceCommerciale,
            m.E_Interlocuteur AS Interlocuteur,
            DECODE(c.Activite, 'SAP', 'Service à la personne', 'INT','Intérim', 'RH', 'Ressources humaines', 'AUT', 'Autres', '') AS Activite                                                                                                ,    
            u.NomPrenom AS Utilisateur,
            Service.Designation AS Service,
            Mail.ARappeler,
            AppelObjet.Designation AS AppelObjet,
            MailDetail.Probleme ,
            MailDetail.Solution
        FROM Mail m
        LEFT OUTER JOIN Client c ON m.E_IDClient = c.IDClient 
            LEFT OUTER JOIN DepartementActivite da
                    ON c.NumDepartement = da.NumDepartement 
                    AND c.Activite = da.Activite 
                LEFT OUTER JOIN AgenceCommerciale ac ON da.IDAgenceCommerciale = ac.IDAgenceCommerciale
        LEFT JOIN Salarie sl ON sl.IDUtilisateur = m.S_IDUtilisateur
            LEFT JOIN Utilisateur u ON sl.IDUtilisateur = u.IDUtilisateur
        LEFT OUTER JOIN Service sv ON m.S_IDService = sv.IDService 
        LEFT JOIN MailDetail md ON m.IDMail = md.IDMail
            LEFT JOIN AppelObjet ao ON md.IDAppelObjet = ao.IDAppelObjet
        WHERE m.IDMail <> 0
    ) tmp 
    WHERE tmp.`Date` BETWEEN '2011-01-01' AND '2011-12-31'

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

Discussions similaires

  1. Requête croisée avec critère de date et service
    Par isabelle b dans le forum Requêtes et SQL.
    Réponses: 26
    Dernier message: 24/12/2008, 19h26
  2. Réponses: 3
    Dernier message: 09/06/2008, 09h17
  3. [SQL] Requête SQL avec critères contraires
    Par HwRZxLc4 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/03/2008, 17h05
  4. Requête union avec group by qui gère les 2 requêtes.
    Par juha dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/10/2007, 09h38
  5. Requête UNION avec champ Oui/non
    Par Mariboo dans le forum Access
    Réponses: 4
    Dernier message: 01/08/2006, 08h36

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