8768 sujets

Développement web côté serveur, CMS

Bonjour,

J'éprouve un peu de mal à expliquer ce que je souhaite. Mais imaginez 2 tables :
Table "utilisateurs" avec 1 record (id, prenom) : "1, Alphonse"
Table "nationalites" avec 3 records (utilisateur_id, nationalite) : "1, Belge", "1, Français" et "1, Espagnol".

En SQL, je souhaite afficher le résultat suivant : chaque ligne correspond à une nationalité de la personne + ses autres nationalités dans une 3ème colonne

| Alphonse | Belge    | Français, Espagnol |
| Alphonse | Français | Belge, Espagnol    |
| Alphonse | Espagnol | Belge, Français    |

En SQL, la requête pourrait ressembler à ça, mais j'y arrive pas.

SELECT
	utilisateurs.prenom, nationalites.nationalite, 
	STRING_AGG(nationalites_autres.nationalite, ', ') AS autres_nationalites
FROM
	utilisateurs, 
	nationalites
WHERE
	utilisateurs.id = nationalites.utilisateur_id

Comment faire ma jointure pour ajouter "nationalites_autres" qui ne serait qu'un alias de "nationalites" liée une 2ème fois.

Merci d'avance,
Modifié par Alphonse (30 Nov 2022 - 14:20)
Modérateur
Salut,

1. un utilisateur peut avoir plusieurs nationalités
2. une nationalité peut avoir plusieurs utilisateurs

Quel est ce type de relation ?
Dans ce cas-ci, l'utilisateur a plusieurs nationalités. C'est du 1-N.

J'ai juste essayé de trouver un exemple qui puisse être parlant. J'aurai pu choisir n'importe quel autre exemple (une "maison" et ses "pièces", etc.).
Modérateur
Alphonse a écrit :
Dans ce cas-ci, l'utilisateur a plusieurs nationalités. C'est du 1-N.

J'ai juste essayé de trouver un exemple qui puisse être parlant. J'aurai pu choisir n'importe quel autre exemple (une "maison" et ses "pièces", etc.).


et non... ton exemple d'appartement est faussé.
- la table rooms peut avoir plusieurs apartments
- la table apartments peut avoir plusieurs rooms

habitation 1 est composée de :
- une cuisine
- un salon
- une chambre

habitation 2 est composée de :
- une cuisine
- un salon
- une chambre
- une cave

ps : Dans quel but veux-tu afficher les utilisateurs n'ayant pas la nationalités x, y, z (dans ce cas la liste peut être extrêmement longue) alors qu'ils ont a, b, c ?
Modifié par niuxe (30 Nov 2022 - 20:20)
Niuxe, je pense que tu es passé à côté du problème initial. En vrai, j'ai 0 table utilisateurs/nationalites dans mon code, j'ai juste essayé de trouver un simple exemple pour exposer mon problème. Rien d'autre.

J'aurai dû juste préciser dans ma question initialise qu'il s'agissait d'une liaison 1-N. Et que mon exemple était purement fictif.
Selon moi, l'idéal serait de faire un LEFT JOIN LATERAL.

Mais voici ma solution (en se basant sur mon exemple fictif) :

SELECT
	utilisateurs.prenom, nationalites.nationalite, 
	STRING_AGG(nationalites_autres.nationalite, ', ') AS autres_nationalites
FROM
	utilisateurs
		INNER JOIN nationalites 
			ON (utilisateurs.id = nationalites.utilisateur_id)
		LEFT JOIN (
			SELECT subq_u.id, subq_n.utilisateur_id, subq_n.nationalite
			FROM utilisateurs AS subq_u, nationalites AS subq_n
			WHERE subq_u.id = subq_n.utilisateur_id
		) AS nationalites_autres
			ON (
				utilisateurs.id = nationalites_autres.id
				AND nationalites.utilisateur_id != nationalites_autres.utilisateur_id
			)
WHERE
	utilisateurs.id = 1
GROUP BY
	utilisateurs.prenom, nationalites.nationalite