CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Requête SQL] Résultat étrange

LepetitJinouga
LepetitJinouga
Niveau 35
18 février 2020 à 13:23:44

Bonjour,

Je travaille actuellement sur un projet étudiant qui consiste à améliorer le système d'emprunt et de retour de livres grâces à une bdd dans une biblio.

Et je suis coincé sur une chose gênante et qui me stress car j'ignore si le résultat étrange est dû simplement à la requête que j'effectue, ou bien dû à une mauvaise conception de la bdd (étant donné que j'ai déjà réalisé pas mal de code en PHP).
Voici la bdd:

https://image.noelshack.com/fichiers/2020/08/2/1582028538-image.png

Imaginons la bibliothécaire souhaite ajouter un nouveau titre comme Dragon Ball Z dans la biblio, mais ce titre sera dès le début présent en 2 exemplaires, voici ma requête:

SELECT DISTINCT  *
             FROM livres, auteur, editeur, exemplaire, emprunt, implementation1, implementation2
                 WHERE
                 livres.numero_livre = implementation1.numero_livre AND
                 implementation1.ID_auteur = auteur.ID_auteur AND
                 implementation1.Siret = editeur.siret
                                    AND      //On retourne dans la table Livre
                 livres.numero_livre = implementation2.numero_livre AND
                 implementation2.ID_exemplaire = exemplaire.ID_exemplaire AND
                 exemplaire.ID_exemplaire = emprunt.ID_exemplaire;

Et là le résultat:

https://image.noelshack.com/fichiers/2020/08/2/1582028589-image.png

Comme nous le constations, ces deux livres ont les mêmes titres, auteurs et éditeurs, mais pas les mêmes numéros d'exemplaire.

Maintenant, imaginons je souhaite ajouter un 3e livre Dragon Ball Z mais venant d'un éditeur différent, comme l'édition Mira (soyons fou):

https://image.noelshack.com/fichiers/2020/08/2/1582028609-image.png

Normalement, seul 3 résultats devaient apparaître à l'écran, mais ici nous en avons 6.

Honnêtement, j'ai cherché toute la journée hier et je n'ai trouvé aucunes réponses qui me conviennent et je ne comprends pas pourquoi un tel résultat est renvoyé, c'est pour cela que je viens demander votre aide.

Je vous en remercie d'avance.

Message édité le 18 février 2020 à 13:24:54 par LepetitJinouga
mov_eax_0
mov_eax_0
Niveau 10
18 février 2020 à 15:59:26

oui c'est un design a chier je te le confirme :ok:
si tu veux de l'aide pour refaire le schéma de donnée, explique les règles de gestion(comment doit fonctionner la bibliothèque), je te ferait un schéma

Message édité le 18 février 2020 à 16:00:43 par mov_eax_0
fanof_banni
fanof_banni
Niveau 12
18 février 2020 à 20:52:28

Ca en fait des tables.

SQL te renvoie tout ce qui est lié.

Quand tu fais ta requête au début il te renvoit ce qu'il a récupéré : le contenu des tables livre-exemplaire-edition (je ne parle pas des table "implementation" vu que c'est juste des tables de jointure)
ex :
DBZ - ex1 - ed1
DBZ - ex2 - ed1
DBZ - ex3 - ed1

Si tu rajoutes une édition, comme chaque exemplaire se retrouve lié, par l'intermédiaire de la table livre, à l'édition, tu doubles les résultats
ex :
DBZ - ex 1 - ed1
DBZ - ex 1 - ed2
DBZ - ex 2 - ed1
DBZ - ex 2 - ed2
DBZ - ex 3 - ed1
DBZ - ex 3 - ed2

Si t'ajoutais plein d'entrée dans la table emprunt tu aurais le même soucis.

Mais tu n'as aucun intérêt à récupérer le contenu de toutes tes tables comme ça, si tu te contentes d'un DISCTINCT Exemplaire.ID_Exemplaire tu retrouveras tes 3 résultats.

Cela dit le schéma est certainement améliorable.

Pseudo supprimé
Pseudo supprimé 18 février 2020 à 22:07:43

Je te conseillerais de te tourner vers des inner join pour clarifier ta requête et ensuite voir si le problème est toujours présent :ok:

LepetitJinouga
LepetitJinouga
Niveau 35
19 février 2020 à 18:04:26

Le 18 février 2020 à 15:59:26 mov_eax_0 a écrit :
oui c'est un design a chier je te le confirme :ok:
si tu veux de l'aide pour refaire le schéma de donnée, explique les règles de gestion(comment doit fonctionner la bibliothèque), je te ferait un schéma

Non merci, j'ai bien vérifié et tout fonctionne, c'est juste dans ce cas ou j'ajoute deux même livres mais avec des éditeurs différents que ça bug, et je préfère garder cette simple erreur que modifier tout mon code pour l'appliquer à une nouvelle bdd.
Certes c'est une mauvaise chose mais on part aussi du principe que j'suis un étudiant, en BTS en + .
Mais je t'en remercie de ta proposition! :)

Le 18 février 2020 à 20:52:28 fanof_banni a écrit :
Ca en fait des tables.

SQL te renvoie tout ce qui est lié.

Quand tu fais ta requête au début il te renvoit ce qu'il a récupéré : le contenu des tables livre-exemplaire-edition (je ne parle pas des table "implementation" vu que c'est juste des tables de jointure)
ex :
DBZ - ex1 - ed1
DBZ - ex2 - ed1
DBZ - ex3 - ed1

Si tu rajoutes une édition, comme chaque exemplaire se retrouve lié, par l'intermédiaire de la table livre, à l'édition, tu doubles les résultats
ex :
DBZ - ex 1 - ed1
DBZ - ex 1 - ed2
DBZ - ex 2 - ed1
DBZ - ex 2 - ed2
DBZ - ex 3 - ed1
DBZ - ex 3 - ed2

Si t'ajoutais plein d'entrée dans la table emprunt tu aurais le même soucis.

Mais tu n'as aucun intérêt à récupérer le contenu de toutes tes tables comme ça, si tu te contentes d'un DISCTINCT Exemplaire.ID_Exemplaire tu retrouveras tes 3 résultats.

Cela dit le schéma est certainement améliorable.

Alors, du coup j'ai essayé de lié la table exemplaire à celle de l'édition en passant par la table implementation, et mon soucis s'était aggravé (même problème mais qui s'applique aussi quand j'ajoute un titre de livre différent d'un autre).
Je suis donc retourné à ma bdd d'origine.
Et non, je n'ai pas ce problème quand un nombre important d'entrées se trouve dans la table emprunt ou emprunteur.

Le 18 février 2020 à 22:07:43 GiletJaune58 a écrit :
Je te conseillerais de te tourner vers des inner join pour clarifier ta requête et ensuite voir si le problème est toujours présent :ok:

Normalement je fais mes jointure avec INNER JOIN, mais là j'ai utilisé WHERE car j'avais pas le choix.
Imagine t'a 3 table tables.
La clé primaire de table 1 a une clé étrangère dans table 2, mais aussi dans ta table 3, cela donnerait donc ce schéma là :
https://image.noelshack.com/fichiers/2020/08/3/1582131565-image.png

Donc, dans ta requête, tu feras un INNER JOIN entre table1 et table2.
Mais après pour revenir dans la table 1 dans la requête, pour faire cette fois un INNER JOIN entre table 1 et table 3...
Je ne sais pas comment le faire et je n'ai pas trouvé.
Si tu sais le faire j'serai très intéressé.

Message édité le 19 février 2020 à 18:06:21 par LepetitJinouga
mov_eax_0
mov_eax_0
Niveau 10
19 février 2020 à 18:34:39

mais qui a fait ça bordel https://image.noelshack.com/fichiers/2016/38/1474488555-jesus24.png
il faut arreter cette personne

LepetitJinouga
LepetitJinouga
Niveau 35
20 février 2020 à 00:18:11

Le 19 février 2020 à 18:34:39 mov_eax_0 a écrit :
mais qui a fait ça bordel https://image.noelshack.com/fichiers/2016/38/1474488555-jesus24.png
il faut arreter cette personne

??

Pseudo supprimé
Pseudo supprimé 20 février 2020 à 08:36:53

J’ai fais ça vite fait dans le train mais ça devrait pour moi donner un truc comme ça :
SELECT * From Livre Inner join implementation2 on Livre.numero_livre = implementation2.numerolivre Inner join implementation1 on Livre.numero_livre = implementation1.numerolivre Inner join auteur on implementation1.id_auteur = auteur.id_auteur Inner join éditeur on implémentation1.siret =éditeur.siret Inner join exemplaire on implémentation2.idexemplaire = exemplaire.idexemplaire Inner join disponibilité on exemplaire.id_exemplaire = disponibilité.id_exemplaire

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment