Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/12/2012, 10h33   #1
Royade
Candidat au titre de Membre du Club
 
Femme
Inscription : avril 2012
Messages : 88
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : avril 2012
Messages : 88
Points : 13
Points : 13
Par défaut requete sql jointure

Bonjour, j'ai un petit soucis avec les jointures;
j'aimerais raccourcir mes requetes et faire si cela est possible:
compter le nombre de membres, le nombre de commentaires, le nombre de membre ayant mi un commentaires , le nombre de jeux , le nombre de note et le nombre de membre ayant mi une note.
J'ai 4 tables:
table1 "membre": id_membre | login | ...
table2 "jeux": id_jeu | nom | ...
table3 "commentaires": id_commentaire | id_membre | id_jeu | commentaire | ...
table4 "notes": id_note | id_membre | id_jeu | note | ...

J'ai fais ça, mais le nombre de note et le nombre de membre ayant mi une note sont égale reciproquement au nombre de commentaires et nombre de membre ayant mi un commentaires..
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
<?php
$red = $bdd->prepare('SELECT COUNT(m.login) AS nbrLigne, 
			     COUNT(c.id_commentaire) AS nbrCommentaire ,COUNT(DISTINCT c.id_membre) AS nbr_membre_commente,
			     COUNT(j.id_jeu) AS nbrJeu,
			     COUNT(n.id_note) AS nbrNote ,COUNT(DISTINCT n.id_membre) AS nbr_membre_note
			     FROM commentaires c
			     INNER JOIN  membres m ON m.id_membre = c.id_membre
			     INNER JOIN jeux j ON j.id_jeu = c.id_jeu
			     INNER JOIN notes n ON n.id_jeu = c.id_jeu');
$red->execute();	
?>
Si quelqu'un a une petite idée.. ou déja me dire si c est possible en une requete
Royade est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 09h50   #2
christele_r
Membre Expert
 
Avatar de christele_r
 
Femme Christele Rubneau
Inscription : novembre 2009
Messages : 1 052
Détails du profil
Informations personnelles :
Nom : Femme Christele Rubneau
Âge : 40
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2009
Messages : 1 052
Points : 1 428
Points : 1 428
Bonjour,
Oui logique tout cela, car tu fait un select en demandant combien remplissent toutes les conditions !
Il te faut utiliser un OR va lire la documentation de nos TOPOS, pour voir la meilleur syntaxe, ou sur google recherche
"selet iner avec OR"

Bonne journée
Christele
christele_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 13h36   #3
Royade
Candidat au titre de Membre du Club
 
Femme
Inscription : avril 2012
Messages : 88
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : avril 2012
Messages : 88
Points : 13
Points : 13
Bonjour, merci pour ta réponse, j'avais déja cherché.. j'ai refais des recherches avec tes mots clés mais j'ai toujours pas trouvé une solution..
J'ai vu qu on pouvais imbriquer des SELECT dans le 1er SELECT et faire mes COUNT() dans les SELECT imbriqués mais du coup ca rajoute des requetes, autant que je fasse les reqêtes separemment ca reviendrais au même.
Royade est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 15h08   #4
christele_r
Membre Expert
 
Avatar de christele_r
 
Femme Christele Rubneau
Inscription : novembre 2009
Messages : 1 052
Détails du profil
Informations personnelles :
Nom : Femme Christele Rubneau
Âge : 40
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2009
Messages : 1 052
Points : 1 428
Points : 1 428
Désolée, je ne suis pas assez forte sur ce point particulier, ne sachant pas, je ferais comme toi, un select par COUNT a obtenir !
Tu sais il faudrait avoir des tables de plusieurs milliers de DATA pour que le ralentissement soit significatif !
christele_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 15h43   #5
Exia93
Membre Expert
 
Homme
Étudiant
Inscription : avril 2012
Messages : 604
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2012
Messages : 604
Points : 1 055
Points : 1 055
Citation:
Envoyé par Royade Voir le message
Bonjour, merci pour ta réponse, j'avais déja cherché.. j'ai refais des recherches avec tes mots clés mais j'ai toujours pas trouvé une solution..
J'ai vu qu on pouvais imbriquer des SELECT dans le 1er SELECT et faire mes COUNT() dans les SELECT imbriqués mais du coup ca rajoute des requetes, autant que je fasse les reqêtes separemment ca reviendrais au même.
Bonjour,

pour utiliser cette technique il faudrait que tu fasse :
Code sql :
1
2
3
SELECT t1.nbUser, t2.nbCommentaire 
FROM ( SELECT COUNT(*) nbUser FROM user ) t1,
( SELECT COUNT(*) nbCommentaire FROM commentaire ) t2;

En factorisant le nombre de requête pour qu'elle regroupe un maximum de donnée, par exemple le nombre d'utilisateur et le nombre de commentaire qu'ils ont posté avec une jointure externe il doit être possible d'avoir ces deux informations en une seul sous-requête.

Ensuite les sous-requêtes ne sont pas a fuir obligatoirement si les tables sont bien indexées et les requêtes optimisées alors elles ne ralentiront pas tant que ça l'exécution.
Exia93 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 18h19   #6
Royade
Candidat au titre de Membre du Club
 
Femme
Inscription : avril 2012
Messages : 88
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : avril 2012
Messages : 88
Points : 13
Points : 13
Salut, merci pour ta réponse, mais ça ne répond pas a ma première question a savoir si une telle requête est possible:
Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
$red = $bdd->prepare('SELECT COUNT(m.login) AS nbrLigne, 
			     COUNT(c.id_commentaire) AS nbrCommentaire ,COUNT(DISTINCT c.id_membre) AS nbr_membre_commente,
			     COUNT(j.id_jeu) AS nbrJeu,
			     COUNT(n.id_note) AS nbrNote ,COUNT(DISTINCT n.id_membre) AS nbr_membre_note
			     FROM commentaires c
			     INNER JOIN  membres m ON m.id_membre = c.id_membre
			     INNER JOIN jeux j ON j.id_jeu = c.id_jeu
			     INNER JOIN notes n ON n.id_jeu = c.id_jeu');
$red->execute();	
?>
et si oui me dire où est mon erreur, christele ma donner le début d'une piste mais je ne trouve pas la solution .
Royade est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 13h56   #7
malgache
Membre éprouvé
 
Homme Yann
IUT Informatique
Inscription : mars 2011
Messages : 400
Détails du profil
Informations personnelles :
Nom : Homme Yann
Localisation : France

Informations professionnelles :
Activité : IUT Informatique

Informations forums :
Inscription : mars 2011
Messages : 400
Points : 452
Points : 452
Salut,

Je ne suis pas sur à 100% mais je pense pas qu'elle puisse marcher correctement ta requête.

Si j'ai bien compris ton site propose des jeux et les membres peuvent commenter/noter ou non les jeux?

(J'essaie de bien cibler ce que tu veux avant de te donner une réponse pour pas t'induire en erreur ^^)
malgache est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h54.


 
 
 
 
Partenaires

Hébergement Web