Problème dans une requête SQl

Par JEAN KIBA, il y a 1 an


Base de données MySQL

Bonjour chers amis, je fais face à un problème de sql et j'ai vraiment besoin qu'on viennent en aide.
Voici la liste des tables

tbl_utilisateur_uti (#uti_id, uti_nom) tbl_classe_cla (#cla_id, cla_name) tbl_filiere_fil(#fil_id, fil_libelle) tbl_site_sit(#sit_id, sit_name) tbl_typeecole_typ(#typ_id, typ_libelle) tbl_affectation_aff(#aff_id, uti_id, sit_id, typ_id) tbl_composer_com(#com_id, cla_id, fil_id, sit_id, typ_id) tbl_appartenir_app(#aff_id, #com_id)

Je voulais ensuite effectuer une requete sql qui va permettre de récupérer les informations de la table de la table tbl_affectation_aff et celle de la tbl_composer_com dans une seule requete et c'est par là ou se trouve le problème parce que le résultat obtenu est une redondance des informations.
voici la requête que j'ai tapé:

SELECT * FROM tbl_utilisateur_uti AS U, tbl_typeecole_typ AS T, tbl_site_sit AS S, tbl_composer_com AS CO, tbl_classe_cla AS C, tbl_appartenir_app AS A, tbl_affectation_aff AS AA, tbl_filiere_fil AS F WHERE AA.uti_id = U.uti_id AND AA.typ_id = T.typ_id AND AA.sit_id = S.sit_id AND CO.cla_id = C.cla_id AND CO.fil_id = F.fil_id AND CO.typ_id = T.typ_id AND CO.sit_id = S.sit_id

La requette ci-dessus affiche une serie des données répétée. Je souhaite obtenir un résultat sans redondance. Je suis sûr et certain que je me suis égaré dans la requete ou je ne dois pas composer ma requete de cette façon. Je viens vers vous pour trouver la solution

15 réponses

JEAN KIBA, il y a 1 an

Merci beaucoup Aecy, vit longtemps pour nous

Aecy, il y a 1 an

Avec plaisir !

JEAN KIBA, il y a 1 an

Merci infiniment Aecy pour m'avoir orienter, la requete que vous m'aview proposé marche très bien, elle répond parfaitement au souci que j'avais

Aecy, il y a 1 an

Impeccable ! J'en suis ravis

Bonne soirée à toi et bon dev

JEAN KIBA, il y a 1 an

Hello Aecy, si ça ne vous dérange pas, c'est possible de faire juste un petit exemple? histoire de bien reveiller mon esprit. Merci pour votre intervention

JEAN KIBA, il y a 1 an

Après avoir lu et comprendre certaines choses à travers le lien que vous m'avez suggeré, voici quelques résultats (J'ai modifié la nommination de tables histoire de ne pas avoir trop de chose à écrire mais logiquement, les choses restent les mêmes )

/*Table affecter*/ a_id Primaire int(11) us_id Index int(11) e_id Index int(11) s_id Index int(11) /*Table appartenir*/ ap_id Primaire int(11) a_id Index int(11) co_id Index int(11) /* Table classe */ c_id Primaire int(11) c_name varchar(50) /* Table Composer */ co_id Primaire int(11) co_alias varchar(5) c_id Index int(11) f_id Index int(11) e_id Index int(11) s_id Index int(11) /* Table ecole */ e_id Primaire int(11) e_name /* Table Filiere */ f_id Primaire int(11) f_name /* Table site */ s_id Primaire int(11) s_name /* Table user */ us_id Primaire int(11) us_name

les requetes maintenant

  1. La requete ci-dessous permet d'obtenir les informations de toutes les classes composées de filières se trouvant dans une école d'un site donné SELECT composer.co_id AS code, class.c_name AS class, composer.co_alias AS Alias, filiaire.f_name AS filiaire, ecole.e_name AS ecole, site.s_name AS site FROM composer LEFT JOIN (class CROSS JOIN filiaire CROSS JOIN site CROSS JOIN ecole) ON ( class.c_id = composer.c_id AND filiaire.f_id = composer.f_id AND ecole.e_id = composer.e_id AND site.s_id = composer.s_id )

    voici le résultat de la requête

-------------------------------------------------------------------------------- code | class | Alias | filiaire | ecole | site -------------------------------------------------------------------------------- 1 | 1ère année | A | aucune filière | primaire | nguba
  1. La requete ci-dessous permet d'obtenir les informations de tous les utilisateurs qui sont affectés dans une école d'un quelconque site
SELECT affecter.a_id AS code, user.us_name AS teacher, ecole.e_name AS ecole, site.s_name AS site FROM affecter LEFT JOIN (user CROSS JOIN ecole CROSS JOIN site) ON ( user.us_id = affecter.us_id AND ecole.e_id = affecter.e_id AND site.s_id = affecter.s_id )

voici le résultat de cette requête

----------------------------------------- code | teacher | ecole | site ----------------------------------------- 1 | name_1 | primaire | nguba
  1. Maintenant, l'idée est de composer une requete qui va creer la relation entre user et la classe
    en se référant aux données de la table affecter et de la table composer.
    indirectement, les user seront représentés par la table affecter et
    les classes par la table composer.
    la requête ci-dessous permet d'obtenir toutes les informations à partir de la table appartenir mais lorsque nous essayons de créer la jointure
    entre les clés secondaires, le résultat obtenu est une redondance, et c'est ça mon plus grand souci SELECT * FROM appartenir JOIN affecter ON appartenir.a_id = affecter.a_id JOIN composer ON appartenir.co_id = composer.co_id
Aecy, il y a 1 an

Tu pourrais utiliser DISTINCT pour éliminer les lignes identiques dans les résultats ou si tu as besoin de données uniques mais que DISTINCT ne fonctionne pas comme tu l'attends, des sous-requêtes ou des agrégations (comme GROUP BY) peuvent t'aider.

Vérifie bien aussi que tes clés sont correctes dans la base de donnée, on sait jamais mais ça peut arriver.

JEAN KIBA, il y a 1 an

Justement, j'ai eu à utiliser la commande DISTINCT, en réalité, le problème ne se trouve pas à son niveau. quand tu regardes la table appartenir elle permet d'enregistrement des informations qui proviennent d'autres tables affecter etcomposer, ces dernières, elles, aussi ont des clés etrangères d'autres tables (user, ecole, etc.), pendant la jointure des autres tables qui immigrents dans les tables affecter etcomposerposent de pproblèmes

Aecy, il y a 1 an

Et avec plusieurs JOIN ça ne fonctionne pas ?

JEAN KIBA, il y a 1 an

ça ne fonctionne pas en tout cas, à moins que vous ayez une méthode pour simplifier les choses

Aecy, il y a 1 an

Pour le coup ca fait beaucoup de JOINTURE mais je peux essayer de regarder à t'écrire quelque chose sur téléphone, je n'ai plus fait de requete SQL depuis des lustres ! Avec les ORM que nous disposons ^^

SELECT user.us_name AS teacher, class.c_name AS class, composer.co_alias AS alias, filiaire.f_name AS filiaire, ecole.e_name AS ecole, site.s_name AS site FROM appartenir JOIN affecter ON appartenir.a_id = affecter.a_id JOIN composer ON appartenir.co_id = composer.co_id JOIN user ON affecter.us_id = user.us_id JOIN class ON composer.c_id = class.c_id JOIN filiaire ON composer.f_id = filiaire.f_id JOIN ecole ON composer.e_id = ecole.e_id JOIN site ON composer.s_id = site.s_id GROUP BY user.us_name, class.c_name, composer.co_alias, filiaire.f_name, ecole.e_name, site.s_name;

Je ne garanti aucun résultat, lorsque je debug j'aime avoir le retour de chaque étape pour trouver le soucis ^^ (ni la qualité de la requete, je suis trop rouiller en requete SQL, faudrait que je refasse des projets sans framework ahah).

JEAN KIBA, il y a 1 an

Ok, merci beaucoup pour les réactions, je vais essayer de taper cette req et voir ce que ça va donner

Aecy, il y a 1 an

Avec plaisir, tiens nous au courant de ton avancée

JEAN KIBA, il y a 1 an

Merci, je vais le faire dès ce soir