JeuWeb - Crée ton jeu par navigateur
Requête avec deux clés étrangères référençant la même table - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Requête avec deux clés étrangères référençant la même table (/showthread.php?tid=4275)



Requête avec deux clés étrangères référençant la même table - Yoda54 - 17-08-2009

Bonsoir,

Avant de déterrer un vieux projet poussiéreux, je m'exerce à la POO en développant une petite application me permettant de gérer les livres de ma bibliothèque.
Un livre est généralement écrit par un écrivain mais quelquse fois aussi par un duo; ma table livre fait donc apparaitre le champ auteur et le champ coauteur. Dans le cadre d'un roman à deux auteurs, ces champs sont remplis par l'ID correspondant aux écrivains de la table auteur.

Mon soucis est que je n'arrive pas à récupérer les noms des auteurs, en tout cas, pas dans la même requête. Mes recherches avec des JOIN ou des UNION n'ont rien donné et je suis entrain de me noyer dans les sous-requêtes. Pourriez-vous me mettre sur la voie d'une solution?
Merci d'avance.


RE: Requête sql avec deux clés étrangères référençant la même table - Sephi-Chan - 17-08-2009

Bonjour,

Une solution simple :


SELECT B.*,
A1.id AS autor_id,
A1.name AS author_name,
A2.id AS coauthor_id,
A2.name AS coauthor_name
FROM books B
LEFT JOIN authors A1 ON A1.id = B.author_id
LEFT JOIN authors A2 ON A2.id = B.coauthor_id

Sinon, tu peux utiliser une relation many-to-many, car un livre peut probablement être écrit par N auteurs, pas seulement un ou deux.


Sephi-Chan


RE: Requête sql avec deux clés étrangères référençant la même table - Yoda54 - 17-08-2009

Je n'avais pas pensé à nommer différemment la table authors et avait obtenu bien évidemment une erreur "Not unique table" quand j'avais cherché dans cette voie-là.
Merci beaucoup.

Juste pour me rafraîchir un peu la mémoire, une relation many-to-many (soit 1..* <--------> 1..*) te conduit à créer une table intermédiaire avec les relations, c'est bien cela?

Sinon pour la petite histoire, je me suis arrêté à 2 auteurs parce que sur les 600 et quelques beaucoup de ma bibliothèque, aucun n'est écrit par plus de deux auteurs mais c'est effectivement une possibilité qui existe (ne serait-ce que si l'on veut lister les auteurs d'un recueil de nouvelles).


RE: [SQL] Requête avec deux clés étrangères référençant la même table - Sephi-Chan - 17-08-2009

Une relation many-to-many implique effectivement une table de relation.

La requête pourrait alors ressembler à :


SELECT B.id AS book_id,
B.title AS book_title,
A.*
FROM books B
LEFT JOIN authors_books AB ON AB.book_id = B.id
LEFT JOIN authors A ON A.id = AB.author_id

Avec Ruby on Rails, je n'avais pas tapé une ligne de SQL depuis longtemps. Ça me manquait presque. Smile


Sephi-Chan


RE: [SQL] Requête avec deux clés étrangères référençant la même table - Yoda54 - 17-08-2009

Ravi d'avoir pu assouvir ta presque nostalgie Smile

En y repensant, j'ai déjà une relation many-to-many et mon problème résulte plus d'un problème de conceptualisation qu'autre chose. Deux leçons à retenir, la première est de ne pas négliger le MCD même pour un petit projet qui parait facile et la seconde que l'on apprend des choses même en faisant fausse route.


RE: [Résolu][SQL] Requête avec deux clés étrangères référençant la même table - Sephi-Chan - 17-08-2009

Ravi d'avoir pu t'aider. Smile

(17-08-2009, 11:00 PM)Yoda54 a écrit : Deux leçons à retenir, la première est de ne pas négliger le MCD même pour un petit projet qui parait facile et la seconde que l'on apprend des choses même en faisant fausse route.

En fait, on apprend sans doute plus en faisant fausse route puisqu'en plus de trouver la bonne piste, on apprend généralement pourquoi les précédentes n'étaient pas bonnes. Smile


Sephi-Chan


RE: [Résolu][SQL] Requête avec deux clés étrangères référençant la même table - Yoda54 - 17-08-2009

On apprend jamais autant que de ses erreurs, j'en suis convaincu. Ce que je voulais dire dans le cas présent c'est qu'en plus d'apprendre de mon erreur, je découvre une méthode à laquelle je n'avais pas pensé.


RE: [Résolu][SQL] Requête avec deux clés étrangères référençant la même table - Morningkill - 18-08-2009

(17-08-2009, 11:08 PM)Yoda54 a écrit : , je découvre une méthode à laquelle je n'avais pas pensé.

Y aurait tu vraiment pensé avec un MCD?

(moi j'aime pas les MCDs, j'aime pas les écrire en tout cas. En retro-doc, je dis pas)

Dans mon appli a moi, j'ai a la fois une many -many pour les auteurs, et aussi pour les traducteurs (Bon, au final, en ce qui concerne les traducteurs, utilité néant, je pense que j'aurai pu me contenter d'un "Plusieurs", que j'utilise déjà quand y en a trop a saisir Smile )

(moi j'aime les applis de bibliotheques, même si, avec tout ce qu'on peut voir sur le web, je me demande si c'est encore bien pertinent : entre Amazon (ou y a une option pour stocker ses listes des livres), LibraryThing, etc .. : bon, aprés, pour les livres francais, ils ont plus de mal)


RE: [Résolu][SQL] Requête avec deux clés étrangères référençant la même table - Yoda54 - 18-08-2009

(18-08-2009, 09:47 AM)Morningkill a écrit :
(17-08-2009, 11:08 PM)Yoda54 a écrit : , je découvre une méthode à laquelle je n'avais pas pensé.

Y aurait tu vraiment pensé avec un MCD?

J'aurais pesé à faire une table relationnelle, oui. En revanche,, la "méthode" que j'ai découverte ici est le fait que nommer une table de deux façons différentes peut avoir une incidence sur le résultat de la requête.

Sinon, comme je l'ai évoqué dans mon premier post, la pertinence de l'appli bibliothèque réside dans l'apprentissage de la POO avec PHP car même sans chercher sur le net, la BDD access que j'utilise depuis des années est largement suffisante.