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


Aecy
Réponse acceptée

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

https://dev.mysql.com/doc/refman/8.4/en/join.html

Aecy
Réponse acceptée

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.

Aecy
Réponse acceptée

Et avec plusieurs JOIN ça ne fonctionne pas ?

Aecy
Réponse acceptée

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).

Aecy
Réponse acceptée

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

Aecy
Réponse acceptée

Impeccable ! J'en suis ravis

Bonne soirée à toi et bon dev

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

  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

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

ç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, je vais le faire dès ce soir

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

Merci beaucoup Aecy, vit longtemps pour nous

Avec plaisir !