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/07/2011, 16h54   #1
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
Par défaut UNION de 2 requêtes dont l'une d'elle contient une jointure

Bonjour à tous,

Voilà, j'ai 2 tables pour gérer les entrainements une stockant les réponses des membres et une pour stocker les invités.
La table "entrainements" contient seulement l'id du membre alors que la table "entrainements_invite" contient le nom de l'invité.
Et je voudrais en 1 requête récupérer le nom du membre (d'où la jointure entre la table "membres" où est stocké le nom du membre et la table "entrainements") et le nom de l'invité, tout ça par rapport à une date.

Voici ma requête :
Code :
1
2
3
4
5
(SELECT M.login FROM membres M 
INNER JOIN entrainements E ON E.idMembre = M.idMembre 
WHERE E.dateEnt = '".$dateId."' AND E.present = '1')
UNION
(SELECT I.nomInvit FROM entrainements_invit I WHERE I.dateEnt = '".$dateId."')
Les requêtes fonctionnement bien séparément.
Et le message d'erreur est "Illegal mix of collations for operation 'UNION'".

Merci d'avance si vous pouvez m'aider.
xtremdisc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 17h03   #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 437
Points : 6 437
Bonjour,

Il faut plutôt faire une jointure supplémentaire entre "entrainements" et "entrainements_invit" sur le numéro de l'entrainement.
__________________
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/07/2011, 17h47   #3
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
Merci Ced pour ta réponse.

J'ai déjà essayé cette méthode mais je dois mal m'y prendre car ça me sort 2 colonnes par ligne (alors que j'en voudrais qu'une) et ça met autant de ligne avec les login des membres qu'il y a d'invité (je sais pas si je me fais bien comprendre ...)

Voici la requête que j'avais essayé :
Code :
1
2
3
4
5
SELECT M.login, I.nomInvit FROM membres M 
INNER JOIN entrainements E ON E.idMembre = M.idMembre 
INNER JOIN entrainements_invit I ON I.dateEnt = '".$dateId."' 
WHERE E.dateEnt = '".$dateId."' AND E.present = '1'
ORDER BY E.dateRec ASC
xtremdisc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 19h29   #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 437
Points : 6 437
Mets-nous un petit jeu de données et le résultat que tu attends.
Ça sera plus facile pour pouvoir t'aider.
__________________
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/07/2011, 22h50   #5
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
Oui tu as raison, je suis pas très clair dans mes explications !

Exemple de résultats :
résultat de la 1ère requête (jointure "entrainement" et "membres") :
(1 colonne)
nommembre1
nommembre2
nommembre3

résulat de la seconde ("entrainement_invit"):
(1 colonne)
nominvite1
nominvite2

le résultat souhaité de l'union ou autre jointure :
nommembre1
nommembre2
nommembre3
nominvite1
nominvite2
et si possible trié par un champ "dateRec" présent dans les 2 tables "entrainements" et "entrainements_invit"

et voici ce que j'obtiens avec la double jointure :
(2 colonnes)
nommembre1 | nominvite1
nommembre1 | nominvite2
nommembre2 | nominvite1
nommembre2 | nominvite2
nommembre3 | nominvite1
nommembre3 | nominvite2
xtremdisc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 09h00   #6
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 437
Points : 6 437
OK, c'est plus clair à présent.
Vu comme ça, il faut bien passer par une UNION.
Le seul problème, c'est qu'apparemment, tes 2 colonnes nommembre et nominvite n'ont pas la même collation. Les jeux de caractères sont peut-être différents, ce qui fait que la collation de l'un est inutilisable avec l'autre.
De quel type sont ces champs, quel jeu de caractère et quelle collation ?

Jette un oeil dans la documentation MySQL ici : http://dev.mysql.com/doc/refman/5.0/...n-charset.html
__________________
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 08/07/2011, 11h45   #7
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
Oh ! Honte à moi !

Merci Ced.

J'avais déjà explorer cette piste (j'avais vu cette possibilité d'erreur dans mes recherches) et mis toutes mes tables en "latin_general_ci" (car j'en avais en "latin_german_ci") mais ça ne résolvait pas le problème.

Mais après ton message, j'ai revérifié et c'était mon champ "nomInvit" qui était resté en "latin_german_ci" (malgré le changement au niveau de la table).

Une fois ce champ modifié, la requête d'UNION fonctionne nickel !

Encore merci et bonne continuation.
xtremdisc 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 03h57.


 
 
 
 
Partenaires

Hébergement Web