Jointure multi tables

WRInaute discret
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...)
 
WRInaute accro
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.
 
WRInaute discret
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
 
WRInaute discret
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
 
WRInaute impliqué
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.
 
WRInaute passionné
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
 
WRInaute accro
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.
 
WRInaute passionné
Zecat a dit:
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 :)
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.
 
WRInaute discret
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!
 
WRInaute passionné
Titanboy a dit:
4D, je sais meme pas ce que c'est!
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.
 
WRInaute accro
longo600 a dit:
moi je n'aime pas parler Anglais alors ca me convient parfaitement.
: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.
 
WRInaute discret
longo600 a dit:
Très accessible pour les débutants, c'est une solution souvent utilisée pour creer des logiciels personnalisés.
@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)? :(
 
WRInaute passionné
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.
 
Discussions similaires
Haut