[RESOLU] Afficher les grands parents

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Afficher les grands parents

Re: Afficher les grands parents

par sasquatch » 06 juil. 2021, 14:14

Ok, merci !

Re: Afficher les grands parents

par Ryle » 06 juil. 2021, 11:56

Hello !

En fait la difficulté est qu'il n'est pas possible en SQL de retranscrire la notion de "qu'importe l'ordre" dans la liste des colonnes retournées par ta requête SQL. Il faut savoir avec précision quelle information doit être retournée, d'où ma suggestion d'identifier chaque individu (même si concrètement tu te moques de la précision du lien de parenté dans ton traitement).

C'est également pour cela que ta première solution créer un sous ensemble ordonné de résultats (ici qu'importe l'ordre, ce qui compte c'est qu'il y en ait un exploitable avec row_number()), puis récupère "nommément" (à partir du numéro retourné par row_number) un a un chacun de ces résultats pour les inclure dans le select.

Re: Afficher les grands parents

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.

Re: Afficher les grands parents

par Ryle » 05 juil. 2021, 11:12

Salutations !

Difficile de t'aider sans connaitre la structure des tables. Tu n'es pas loin dans ta démarche, il faut effectivement interroger la table personnes autant de fois que tu en as besoin avec des alias différents pour chacun des grands parents. Toutefois pour que cela fonctionne il faudrait que tu puisses distinguer chacun des grands parents. As-tu dans ta table "relations" une information qui indique si c'est un grand-père ou une grand-mère et si celui-ci est du côté paternel ou maternel ?

Sans cette information, tu ne pourras pas distinguer le grand parent 1 du 2, du 3 ou du 4 et les retourner dans un seul enregistrement comme tu le souhaites...

En gros l'idée serait de faire un truc du genre :
SELECT e.nom, e.prenom, gp1.nom, gp1.prenom, gp2.nom, gp2.prenom ...
FROM relations p_e
INNER JOIN relations gp_p ON gp_p.enfant = p_e.parent
INNER JOIN personnes gp1 ON gp1.id = gp_p.parent AND pg1.lien = 'GP-PAT' -- ex : Grand Père paternel
INNER JOIN personnes gp2 ON gp2.id = gp_p.parent AND pg2.lien = 'GM-MAT' -- ex : Grand Mère maternelle
...
INNER JOIN personnes e ON e.id = p_e.enfant
ORDER BY e.id;
C'est juste un exemple, idéalement le lien pourrait être un identifiant (1 pour GP Mat, 2 pour GM Mat, etc.) pour optimiser le truc. Mais l'idée est de pouvoir cibler une personne en particulier à chaque fois :)

Re: Afficher les grands parents

par sasquatch » 04 juil. 2021, 11:24

Bonjour,

Après quelques essais et de l'aide, j'arrive péniblement à afficher un grand parent par ligne (il faut donc 4 lignes pour afficher les 4 grand parents):

Code : Tout sélectionner

SELECT e.nom, e.prenom, gp.nom, gp.prenom FROM relations p_e INNER JOIN relations gp_p ON gp_p.enfant = p_e.parent INNER JOIN personnes gp ON gp.id = gp_p.parent INNER JOIN personnes e ON e.id = p_e.enfant ORDER BY e.id;

Mais je n'arrive toujours pas à trouver comment faire pour avoir à chaque ligne:

Code : Tout sélectionner

Grand enfant, Grand parent 1 , Grand parent 2 , Grand parent 3 , Grand parent 4
Merci.

Afficher les grands parents

par sasquatch » 03 juil. 2021, 12:53

Bonjour !

Je suis un cours pas à pas sur les SELECT en SQL, qui introduit les :

-COUNT
-DISTINCT
-WHERE (+IN / EXISTS)
-GROUP BY (+HAVING)
-INNER/LEFT OUTER JOIN

A l'aide de ça (et de ça seulement), j'essaye d'afficher chaque petit enfant et ses 4 grands parent depuis deux tables:

1) "personnes" (id, prenom, nom)
2) "relations" (parent,enfant)

Mais je bloque.
J'arrive à afficher chaque parent et chacun de ses enfants comme ceci:

Code : Tout sélectionner

SELECT p.nom, p.prenom, e.nom, e.prenom FROM personnes p INNER JOIN relations ON p.id = relations.parent INNER JOIN personnes e ON e.id = relations.enfant;

Mais pour afficher les 4 grands parents de chaque petit enfant (une ligne = petit enfant + GP1+GP2+GP3+GP4), je suis dépassé par le niveau d'abstraction.

Vos lumières m'éclaireraient beaucoup.

Merci !