Jointure multi tables

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par Titanboy, 5 Avril 2013.

  1. Titanboy
    Titanboy WRInaute discret
    Inscrit:
    14 Mars 2006
    Messages:
    72
    J'aime reçus:
    0
    Hello all!

    Voilà, j'ai fais une nuit blanche, j'arrive au bout de mes forces...
    Je cherche un(e) héros qui trouver la formule magique...

    Je cherche à récuperer des infos à travers 3 tables différentes, on se dirige donc vers des jointures...
    Voici les tables en version simplifiées:
    Code:
    Table membres
    id      nom_du_membre      date_inscription      parrain
    
    Table sujet
    id      id_membre          date_creation
    
    Table reponse
    id      id_membre          date_creation
    
    Et je souhaite trouver la requete qui me permettra d'afficher avec un while, la totalité des actions du filleul d'un membre donné, plus ses propres actions, classées dans un ordre chronologique, et en leur attribuant une valeur de façon à obtenir un total! (Respirer)

    En gros, si Julien s'est inscrit sur le site, ca lui a rapporté 6 points, s'il cré un sujet sur le site, ca lui en rapporte 4, et s'il répond à un sujet, ca lui en rapporte 2.
    Et si un de ses filleul (donc ayant l'id de julien dans la case parrain de la table membre) s'inscrit, ca lui rapporte 3 points, s'il cré un sujet, ca lui rapporte 2 points, et s'il répond, ca lui rapporte 1 point (a Julien toujours)

    Pour au finale obtenir:
    01-01-13 - inscription - 6 points
    02-01-13 - création sujet - 4 points
    03-01-13 - inscription filleul Roger - 3 points
    04-01-13 - réponse filleul Roger - 1 points
    05-01-13 - réponse sujet - 2 points
    etc...
    Total 62 points.

    J'ai essayé de faire simple dans l'explication, et je prie tous les dieux de l'univers informatique pour que l'un d'eux pose ses yeux sur ce sujet, et me sorte l'abracadabra qui me rendra complètement fou de joie derrière mon écran! (J'en ai fais assez là?)(OUI!)(Non?)(Ah...)(Soupir...)
     
  2. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 203
    J'aime reçus:
    365
    Avec MySQL Workbench, tu peux drag'n'drop tes 3 tables, créer les liaisons comme dans MS Access (easy game) et ça te pond la requête SQL.
     
  3. Titanboy
    Titanboy WRInaute discret
    Inscrit:
    14 Mars 2006
    Messages:
    72
    J'aime reçus:
    0
    génial!
    Je savais pas que ça existait un truc comme ça! Et je me fais chier depuis 10 ans, à me faire bruler les neurones avec des requêtes sur 10 lignes...
    Merci spout! C'est pas la première fois que tu m'aides, t'es au top :p
     
  4. Titanboy
    Titanboy WRInaute discret
    Inscrit:
    14 Mars 2006
    Messages:
    72
    J'aime reçus:
    0
    Oups, je suis allé trop vite, je comprend pas trop comment ca fonctionne! Tu sais pas s'il existe un tuto? J'ai reussi à télécharger une bdd à partir d'un fichier sql, mais maintenant je bloque, je vais continuer a me creuser la tete... A moins que? :D
     
  5. Blount
    Blount WRInaute impliqué
    Inscrit:
    18 Novembre 2010
    Messages:
    701
    J'aime reçus:
    0
    Personnellement, je récupérais les informations en 2 requètes. Une pour la personne concernée et l'autre pour les filleuls.
    Code:
    SELECT id, nom_du_membre, date_inscription, COUNT(s.id) nombre_sujets, COUNT(r.id) nombre_reponses
    FROM membres m
    LEFT JOIN sujet s ON s.id_membre = m.id
    LEFT JOIN reponse r ON r.id_membre = m.id
    WHERE m.id = X
    GROUP By m.id
    
    SELECT id, nom_du_membre, date_inscription, COUNT(s.id) nombre_sujets, COUNT(r.id) nombre_reponses
    FROM membres m
    LEFT JOIN sujet s ON s.id_membre = m.id
    LEFT JOIN reponse r ON r.id_membre = m.id
    WHERE m.parrain = X
    GROUP By m.id
    
    Ensuite en PHP, tu fais les calcules. Tu multiplies les nombre_sujets et nombre_reponses par leur valeur en point.
    Pour l'inscription, c'est simple, chaque tour de boucle sur un filleul rapporte les points concernées (un filleul = forcément une inscription).

    C'est à tester, j'ai des doutes sur les count.
     
  6. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 203
    J'aime reçus:
    365
  7. longo600
    longo600 WRInaute passionné
    Inscrit:
    24 Février 2005
    Messages:
    2 166
    J'aime reçus:
    7
    Bonjour,

    hélas je travailles sur 4D, mais en gros, il devrait exister le même principe sur ta base, dans laquelle je vois des tables liées.

    Sur 4D, il y a une fonction CHARGER SUR LIEN, soit de [table_principale] vers toutes les tables liées a celle-ci, soit de la [table_principale]champ1 vers [table_liee1]champ1; dans ce dernier cas, les 2 champs doivent êtres du même type.

    Tu n'a plus qu'a additionner le total des champs trouvé par les liens et soit creer un tableau, soit intégrer les champs dans php
    Code:
    Chercher ([table_principale];[table_principale]champachercher="valide")
    boucle($i;1;enregistrements trouvés([table_principale]))
    charger sur lien([table_principale]) // charge toutes les tables et selectionne les enregistrements liées a l'enregistrement principal en cours
    $variabletotal:=0 //initialiser la variable a zéro
    $variabletotal:=$variabletotal+[table_liee1]champ8
    $variabletotal:=$variabletotal+[table_liee4]champ3
    $variabletotal:=$variabletotal+[table_liee5]champ2
    $variabletotal:=$variabletotal+[table_liee9]champ6
    // faire qq chose avec la variable $variabletotal
    // creer des tableaux avec chaque valeur et faire ensuite un multi-tris avec un affichage a l'aide des varaibles ou des champs dans php
    enregistrement suivant([table_principale])
    fin de boucle
     
  8. Zecat
    Zecat WRInaute accro
    Inscrit:
    1 Mars 2005
    Messages:
    9 119
    J'aime reçus:
    1
    Je voudrais pas dire longo mais une "Selection vers tableau" suivi d'un boucle($i;1;$imax) serait de bon aloi et plus performant qu'une lecture sequentielle de tous les records :mrgreen: Et dire que ca fait 10 ans que j'ai pas touché à 4D :)

    Allez tiens, j'ai creusé dans des vieilles couches de neurones :

    Liens automatiques (vrai;vrai) <---- la je suis plus trop sur , faudrait relire la doc
    Chercher(...)
    selection vers tableau(champs1;$tab1; .... les champs dont tu as besoin)
    Liens automatiques (faux;faux)

    $cumul1=0
    $imax=tailletableau($tab1)
    boucle($i;1;$imax)
    $cumul1=$cumul1+$tab1($i)
    $i=$i+1
    fin de boucle

    Important : les tableaux et les $i $imax en variable locales pour que ca droppe :mrgreen: tu peux aussi desactiver le controle d'execution avant le boucle et le remettre apres (me souviens plus trop la syntaxe %r- et %r+ je crois .. c'etait y a 10 ans !) pour accéller la boucle si elle est grosse.
     
  9. longo600
    longo600 WRInaute passionné
    Inscrit:
    24 Février 2005
    Messages:
    2 166
    J'aime reçus:
    7
    Tu as raison, mais j'ai pas voulu compliqué la chose vue que je ne sais pas pas comment fonctionne sql ...

    Pour 4D, il y a depuis "selection limité vers tableau" (version V13.2) encore mieux puisque tu ne fais plus des boucle sur chaque enregistrement mais sur un nombre d'enregistrements que tu fixe et que ta mémoire est capable de gérer, c'est pratique pour des gros volumes de traitement.
    Tu peux ainsi faire des boucles 1000 par 1000 au lieu de 1 par 1. (ce qui crée un tableau de 1000 ligne a traiter par boucle ou calcul par la suite, mais c'est en mémoire et bcp plus rapide).
    Mais dans le cas de @Titanboy , il me semble que c'est une méthode simplement appelée lorsque l'utilisateur consulte son compte?

    Bref, le résultat est qu'il s'y retrouve.
     
  10. Titanboy
    Titanboy WRInaute discret
    Inscrit:
    14 Mars 2006
    Messages:
    72
    J'aime reçus:
    0
    Ou la!
    C'est du japonnais à ce niveau! 4D, je sais meme pas ce que c'est!
    Pauvre de moi, je suis pas à la page on dirait...
    Bref, pour conclure, j'ai pas réussi, j'ai essayé workbench, j'ai pas réussi à le faire marché, j'ai rien compris, alors j'ai opté pour la création d'une nouvelle table, dans laquelle s'enregistre chaque donnée, avec l'id du sujet, l'id du membre, et l'id de son parrain, ca sera bien plus simple... Après 48h, j'ai craqué! ^^
    Merci quand meme à vous les amis!
     
  11. longo600
    longo600 WRInaute passionné
    Inscrit:
    24 Février 2005
    Messages:
    2 166
    J'aime reçus:
    7
    C'est une base de données Française, qui se programme avec des commandes toutes pretes en Français (ou au choix en anglais), ou par tout autre langage (C++, pascal etc). Très accessible pour les débutants, c'est une solution souvent utilisée pour creer des logiciels personnalisés.

    Ciel compta a été réalisé sous 4D a une époque il me semble, les grandes administrations, Aérospatiale, grand groupes utilisent souvent 4D pour des développements Serveur/client en interne. Bref, on aime ou n'aime pas, moi je n'aime pas parler Anglais alors ca me convient parfaitement.
     
  12. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 021
    J'aime reçus:
    1
    :D Autant je comprend qu'on puisse ne pas apprécier une techno par rapport a une autre mais évoquer l'anglais dans le domaine de la programmation c'est une peut limite comme "excuse" :wink: . Moi aussi j'aime pas les brits, il me donnent l'impression d'être les "parisiens du monde" mais la prog c'est pas un souci pour les 200 mots qui sont nécessaires au max.
     
  13. Titanboy
    Titanboy WRInaute discret
    Inscrit:
    14 Mars 2006
    Messages:
    72
    J'aime reçus:
    0
    @longo600 Pour un de mes sites, je cherche à développer une appli iphone, mais le language objective C Aïe Aïe Aïe, je m'y suis mis depuis quelques jour, mais c'est une vrai galère, tu crois que du coup ca vaut le coup que je me tourne vers cet outils (4D)? :(
     
  14. longo600
    longo600 WRInaute passionné
    Inscrit:
    24 Février 2005
    Messages:
    2 166
    J'aime reçus:
    7
    Je crois que pour les mobile, 4D a dev un nouveau type de plate forme totalement java script qui s'appelle Wakanda et gratuite.

    Mais je n'ai pas les compétences pour t'en dire plus.

    De toute maniere, tu peux utiliser les démo en full gratuit pendant 30 jours, donc , va jeter un oeil sur http://www.4D.fr , et vois avec les versions démo, les bases d'exemples et la doc si ca te plait ou pas.
    Ca peut se coupler avec du php ou pas, se connecter et echanger avec des base sql, ...tout est possible ... il faut que ca plaise.

    Seul probleme, de 4D ... le prix des licences, ca cogne (+1 000 euros) sauf Wakanda qui est gratuit et open source.
     
  15. Titanboy
    Titanboy WRInaute discret
    Inscrit:
    14 Mars 2006
    Messages:
    72
    J'aime reçus:
    0
    ok, je vais voir ça... thanks! Et vive le noctambulisme...
     
Chargement...
Similar Threads - Jointure multi tables Forum Date
MySQL, jointures multiples, WHERE et psychiatrie Développement d'un site Web ou d'une appli mobile 27 Juillet 2010
Optimisation requêtes : jointures / index ? Développement d'un site Web ou d'une appli mobile 28 Juin 2014
Problème en Les Jointure Développement d'un site Web ou d'une appli mobile 14 Mai 2014
Optimisation de requêtes par jointure Développement d'un site Web ou d'une appli mobile 1 Juillet 2013
PB résultat Requête SQL avec jointure 3 tables Développement d'un site Web ou d'une appli mobile 12 Juin 2013
2 requêtes ou jointure ? Développement d'un site Web ou d'une appli mobile 9 Avril 2013
problème de jointure Débuter en référencement 20 Décembre 2012
Optimisation + jointure Développement d'un site Web ou d'une appli mobile 23 Avril 2012
Problème de jointure entre deux tables requête SQL Développement d'un site Web ou d'une appli mobile 11 Avril 2011
Jointure qui ne fonctionne pas Développement d'un site Web ou d'une appli mobile 23 Mai 2010
Jointure sql problème inner join Développement d'un site Web ou d'une appli mobile 4 Mai 2010
Comment simplifier une double requête par jointure? Développement d'un site Web ou d'une appli mobile 2 Mars 2010
inconvénients des jointures sur le temp de traitement d'une requette Développement d'un site Web ou d'une appli mobile 27 Août 2009
MYSQL : jointure Développement d'un site Web ou d'une appli mobile 29 Juillet 2009
JOINTURE SQL: problème de doublon Développement d'un site Web ou d'une appli mobile 24 Mars 2009
[résolu] jointure et 'distinct' Développement d'un site Web ou d'une appli mobile 6 Janvier 2009
Problème choix syntaxe jointure Développement d'un site Web ou d'une appli mobile 4 Août 2008
(Résolu par une jointure)[MYSQL] Dissocier ma requête ? Administration d'un site Web 16 Juin 2008
Enregistrements non compris dans une jointure SQL Développement d'un site Web ou d'une appli mobile 30 Janvier 2008
Jointure sur 2 serveurs Mysql ? Développement d'un site Web ou d'une appli mobile 28 Janvier 2008