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
Hello, a ce que je vois tu utilises des jointures implicites avec WHERE, ce qui n'est pas top. Tu devrais plutot utiliser des jointures explicites avec JOIN
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.
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).
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
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
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
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
SELECT
*
FROM appartenir JOIN affecter ON appartenir.a_id = affecter.a_id
JOIN composer ON appartenir.co_id = composer.co_id
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
etcomposer
posent de pproblèmes
ça ne fonctionne pas en tout cas, à moins que vous ayez une méthode pour simplifier les choses
Ok, merci beaucoup pour les réactions, je vais essayer de taper cette req et voir ce que ça va donner
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