Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/06/2011, 11h06   #1
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
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 :
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 :
1
2
WHERE nom > "D"
AND prenom < "B"
ne fonctionne pas?
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 11h18   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Parce qu'il faut le répéter dans chaque requête.
Ou alors, il faut passer par une sous-requête :
Code :
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.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 11h24   #3
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
Ok mais j'ai pas les mêmes noms de champs dans mes tables, j'utilise des alias...comment faire dans ce cas?
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 11h43   #4
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Mets les mêmes alias dans les 2 requêtes réunies par l'union :
Code :
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.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 11h47   #5
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
OK Merci!
Je vais tester!
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 15h33   #6
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
Alors ça ne fonctionne pas je place ici ma requête

Code :
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 :
Le fichier Client n'existe pas dans la clause From
Merci d'avance pour votre aide...
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 17h52   #7
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
C'est quoi ces noms de colonnes dans les sub-select qui ne sont pas séparés par des virgules ?
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 20h41   #8
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 852
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 852
Points : 1 330
Points : 1 330
salut,

déjà essaye de mettre les requêtes dans tes union entre parenthèse:
Code sql :
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 !
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 12h01   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 007
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 007
Points : 18 278
Points : 18 278
Envoyer un message via MSN à CinePhil
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 :
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'
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h29.


 
 
 
 
Partenaires

Hébergement Web