[RESOLU] GROUP BY des résultats des 2 tables

Avatar du membre
Mammouth du PHP | 1564 Messages

20 nov. 2021, 01:59

J'ai deux tables:

"membres"
colonnes: id, pseudo, mail

"mails"
colonnes: mail

Je souhaite regrouper tous les mails, sans faire de doublons.

Je souhaite que le résultat retourne les colonnes "id", "mail" et "pseudo"

UNION fonctionne bien mais je peux pas avoir id et pseudo de la table membres avec.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 nov. 2021, 14:17

Regarde du côté des jointures SQL :
https://sql.sh/cours/jointures
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

20 nov. 2021, 15:14

C'est ce que j'ai fait, ça ne peut pas marcher car une jointure doit être faite avec un concordance (si j'ai bien compris) donc je peux pas demander "est ce que table1.id = table2.id"

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

21 nov. 2021, 13:44

Ah oui effectivement, j'avais lu trop vite.

Pour que UNION fonctionne il te faut le même nombre de colonnes.
:idea: L'astuce est de créer des colonnes "virtuelles" dans ton SELECT :
SELECT NULL AS id, NULL AS pseudo, mail FROM mails
Va t'afficher ta table mails avec des colonnes id et pseudo null (sachant que tu peux remplacer NULL dans ma requête en réalité par ce que tu veux)

Du coup, désormais ton UNION va fonctionner (un conseil en passant, il vaut mieux nommer explicitement ses colonnes dans le SELECT d'un UNION ça permet de s'assurer qu'elles soient dans le même ordre) :
SELECT id, pseudo, mail FROM membres UNION SELECT NULL AS id, NULL AS pseudo, mail FROM mails

:!: Sauf que... tu veux les mails sans doublon, or UNION va supprimer les doublons mais uniquement les doublons qui ont le même id, le même pseudo et le même email, ce qui n'est pas ce que tu veux puisqu'on vient de remplir ta table mails avec des valeurs NULL pour l'id et le pseudo...


:idea: La 2ème astuce est de réimbriquer ta requête UNION dans une 3ème avec un simple GROUP BY mail :
SELECT * FROM (SELECT id, pseudo, mail FROM membres UNION SELECT NULL AS id, NULL AS pseudo, mail FROM mails) AS tmp GROUP BY mail

:arrow: Et là ça devrait marcher comme tu veux ! :D
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

21 nov. 2021, 17:15

Trop fort! Merci.
un conseil en passant, il vaut mieux nommer explicitement ses colonnes dans le SELECT d'un UNION ça permet de s'assurer qu'elles soient dans le même ordre
Merci.

:idea: La 2ème astuce est de réimbriquer ta requête UNION dans une 3ème avec un simple GROUP BY mail :
SELECT * FROM (SELECT id, pseudo, mail FROM membres UNION SELECT NULL AS id, NULL AS pseudo, mail FROM mails) AS tmp GROUP BY mail
Je testerais demain ;)

On peut peut être nommer la table membres pour donner l'id et le pseudo à la table mails ?

Exemple:
SELECT id, pseudo, mail FROM membres m1 UNION SELECT id.m1 AS id, pseudo.m1 AS pseudo, mail FROM mails m2
Pas testé..

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

21 nov. 2021, 18:37

On peut peut être nommer la table membres pour donner l'id et le pseudo à la table mails ?
Pas sûr d'avoir compris ton idée mais je dirai que ce n'est pas utile vu que tu as déjà l'info complète dans la table membres, donc il suffit de conserver cette info lors du dédoublonnage.
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

21 nov. 2021, 19:43

Mon idée est de mettre la valeur de la colonne id et pseudo de la table membres dans les colonnes artificielles (id et pseudo) de la table mails, ceci afin d'enlever les doublons.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

22 nov. 2021, 10:57

Du coup je confirme que ce n'est pas utile vu que tu as déjà l'info complète dans la table membres ;)
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

22 nov. 2021, 12:36

Merci, ta solution fonctionne parfaitement:
SELECT * FROM (SELECT id, pseudo, mail FROM membres UNION SELECT NULL AS id, NULL AS pseudo, mail FROM mails) AS tmp GROUP BY mail
La mienne ne fonctionne pas ;)

C'est tellement puissant le SQL, je suis bluffé à chaque fois mais ça me dépasse, merci pour l'aide!