par
sasquatch » 05 juil. 2021, 11:30
Bonjour et merci BEAUCOUP pour ton aide.
J'ai écrit la structure (très simple) des tables dans le premier message:
Table "personnes" = id, "prenom", "nom"
Table "relations" = "parent","enfant"
Parent et enfant étant de simples foreign keys de personnes.id.
Et non, justement, il n'y a ps d'information de grande parenté, juste de parenté (et les parents peuvent être des enfants à leur tour et donc avoir des parents qui sont grands parents de leurs enfants par déduction...). La notion de paternel/maternel est superflue, il faut juste afficher les 4 grands parents (s'il y en a 4), qu'importe l'ordre. Pour les distinguer, je pense qu'il faudra juste compare leur id pour s'assurer qu'il n'y ait pas de doublon.
Merci pour ton ébauche de requête.
Je vois bien ce que tu veux faire avec pg1.lien et pg2.lien. L'idée semble originale mais je ne vois pas trop comment l'utiliser dans le reste de la requête à mettre à la place des "...".
PS: j'ai une réponse au problème qui donne exactement la sortie désirée mais cette réponse est tirée par les cheveux et utilise des clauses exotiques.
Je reste persuadé qu'il y a plus simple.
Voici la requête:
Code : Tout sélectionner
SELECT
prenom,
nom,
MAX(CASE WHEN ordre = 1 THEN grandparent_nom END) as grandparent_1,
MAX(CASE WHEN ordre = 2 THEN grandparent_nom END) as grandparent_2,
MAX(CASE WHEN ordre = 3 THEN grandparent_nom END) as grandparent_3,
MAX(CASE WHEN ordre = 4 THEN grandparent_nom END) as grandparent_4
FROM (
SELECT e.id,
e.prenom,
e.nom,
gp.prenom || " " || gp.nom as grandparent_nom,
ROW_NUMBER() OVER (PARTITION BY e.id ORDER BY gp.prenom, gp.nom) as ordre
FROM relations p_e
JOIN relations gp_p ON gp_p.enfant = p_e.parent
JOIN personnes gp ON gp.id = gp_p.parent
JOIN personnes e ON e.id = p_e.enfant
)
GROUP BY prenom, nom, id;
J'ai aussi cette solution qui est ultra simple et élégante mais elle triche un peu (tous les grands parents sont concaténés dans une même colonne plutôt que d'avoir chacun leur propre colonne)
Code : Tout sélectionner
SELECT
p.prenom,
p.nom,
GROUP_CONCAT(gp.prenom || ' ' || gp.nom, ', ')
FROM personnes p
INNER JOIN relations r1 ON r1.enfant = p.id
INNER JOIN relations r2 ON r2.enfant = r1.parent
INNER JOIN personnes gp ON r2.parent = gp.id
GROUP BY p.id
J'aurais aimé le résultat du premier avec l'élégance du second.
Ton début de solution me plait mais je ne vois pas comment l'exploiter jusqu'au bout pour obtenir le résultat voulu.
Bonjour et merci BEAUCOUP pour ton aide.
J'ai écrit la structure (très simple) des tables dans le premier message:
Table "personnes" = id, "prenom", "nom"
Table "relations" = "parent","enfant"
Parent et enfant étant de simples foreign keys de personnes.id.
Et non, justement, il n'y a ps d'information de grande parenté, juste de parenté (et les parents peuvent être des enfants à leur tour et donc avoir des parents qui sont grands parents de leurs enfants par déduction...). La notion de paternel/maternel est superflue, il faut juste afficher les 4 grands parents (s'il y en a 4), qu'importe l'ordre. Pour les distinguer, je pense qu'il faudra juste compare leur id pour s'assurer qu'il n'y ait pas de doublon.
Merci pour ton ébauche de requête.
Je vois bien ce que tu veux faire avec pg1.lien et pg2.lien. L'idée semble originale mais je ne vois pas trop comment l'utiliser dans le reste de la requête à mettre à la place des "...".
PS: j'ai une réponse au problème qui donne exactement la sortie désirée mais cette réponse est tirée par les cheveux et utilise des clauses exotiques.
Je reste persuadé qu'il y a plus simple.
Voici la requête:
[code]SELECT
prenom,
nom,
MAX(CASE WHEN ordre = 1 THEN grandparent_nom END) as grandparent_1,
MAX(CASE WHEN ordre = 2 THEN grandparent_nom END) as grandparent_2,
MAX(CASE WHEN ordre = 3 THEN grandparent_nom END) as grandparent_3,
MAX(CASE WHEN ordre = 4 THEN grandparent_nom END) as grandparent_4
FROM (
SELECT e.id,
e.prenom,
e.nom,
gp.prenom || " " || gp.nom as grandparent_nom,
ROW_NUMBER() OVER (PARTITION BY e.id ORDER BY gp.prenom, gp.nom) as ordre
FROM relations p_e
JOIN relations gp_p ON gp_p.enfant = p_e.parent
JOIN personnes gp ON gp.id = gp_p.parent
JOIN personnes e ON e.id = p_e.enfant
)
GROUP BY prenom, nom, id;[/code]
J'ai aussi cette solution qui est ultra simple et élégante mais elle triche un peu (tous les grands parents sont concaténés dans une même colonne plutôt que d'avoir chacun leur propre colonne)
[code]SELECT
p.prenom,
p.nom,
GROUP_CONCAT(gp.prenom || ' ' || gp.nom, ', ')
FROM personnes p
INNER JOIN relations r1 ON r1.enfant = p.id
INNER JOIN relations r2 ON r2.enfant = r1.parent
INNER JOIN personnes gp ON r2.parent = gp.id
GROUP BY p.id
[/code]
J'aurais aimé le résultat du premier avec l'élégance du second.
Ton début de solution me plait mais je ne vois pas comment l'exploiter jusqu'au bout pour obtenir le résultat voulu.