IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Deux COUNT dans une requête


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Deux COUNT dans une requête
    J'ai 3 tables...

    Films (id, titre, annee)
    Critiques (id_film, id_user, critique)
    Logs (heure,laDate,id_film)

    Je veux faire une requête qui me sort, selon les logs, les fiches de films les plus visitées. Celle-ci fonctionne:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT L.id_film, F.titre, count( L.id_film ) AS compte
    FROM logs AS L
    JOIN films F ON F.id = L.id_film
    GROUP BY L.id_film
    ORDER BY compte DESC

    Cette requête fonctionnelle affiche le nombre de visites par film. Le problème, c'est quand je veux en plus afficher le nombre de critiques pour ce film.

    Mon premier réflexe a été de faire:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT L.id_film, F.titre, count( L.id_film ) AS compte, count( C.id_film ) AS compte2
    FROM logs AS L
    JOIN films F ON F.id = L.id_film
    JOIN critiques C ON C.id_film = L.id_film
    GROUP BY L.id_film
    ORDER BY compte DESC

    ...mais ça ne marche pas: mon "compte" est écrasé et remplacé par la même valeur que "compte2"

  2. #2
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Je dirai que ton COUNT sans la clause GROUP BY renvoie simplement le nombre de lignes dans le résultat. Donc forcément c'est la meme requete donc le meme nombre de lignes.

    Avant ton ORDER BY, je rajouterai un GROUP BY F.id_film qui va te permettre de récupérer, pour chaque film le nombre de critiques.

    Mais j'avoue ne pas en être sur, faudrait tester

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Oups, en effet, je crois que le GROUP BY était déjà dans ma requête (désolé, je n'ai pas accès à mon code présentement, c'est de mémoire). J'ai édité mon premier message pour l'afficher.

    Reste que l'essence du problème appraît quand je met un 2e COUNT en appelant cette table additionnelle des critiques...

  4. #4
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Autre chose tu comptes le nombre de résultats dans L pour id_film et dans C pour id_film. Mais ca ne te donnera pas le nombre de lignes TOTALES dans chaque table, ca te donne le nombre de lignes de ces deux tables présentes dans la requete, or c'est le meme nombre puisque tu fais une jointure dessus.

    je ferai plutot ca:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT F.id, F.titre, COUNT(*) as NbCritiquesParFilm
    FROM Films as F
    JOIN Logs L ON L.id_film=F.id
    JOIN Critiques C ON C.id_film=L.id_film
    GROUP BY L.id_film
    ORDER BY compte DESC, compte2 DESC

    Et ensuite quand tu vas afficher le nombre de critiques par film tu vas lire tous les résultats et dans ce cas tu sauras le nombre de films (en gros tu utilises mysql_num_rows() ou tu utilises un compteur)

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    C'est ce que je pensais, je n'aurai pas le choix de mettre un peu de traitement PHP dans tout ça... je me demandais si le tout pouvait être fait en une seule requête!

    Merci!

    Comme je disais je n'ai pas accès au code mais je vais tester tout ça dans quelques heures...

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bon, j'ai fais le test avec la requête, Koopajah... çca ne marche pas, il me sort un gros chiffre, plus gros que le nombre de critiques possible pour les films que j'ai dans ma base...

    J'ai aussi ré-édité dans mon premier messages les vraies requêtes du code.

Discussions similaires

  1. Deux COUNT dans une seule requête
    Par aya02 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/07/2010, 10h17
  2. [Oracle] Deux COUNT dans une seule requête
    Par EvilJajuka dans le forum Débuter
    Réponses: 5
    Dernier message: 30/09/2009, 11h00
  3. [Requete] Deux count dans une requete
    Par wperezrobles dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 03/10/2006, 09h17
  4. [VB6] Comparaison de deux dates dans une requête
    Par paradeofphp dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/06/2006, 19h45
  5. Additionner deux champs dans une requête
    Par eddyG dans le forum Access
    Réponses: 5
    Dernier message: 30/05/2006, 18h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo