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

Requêtes MySQL Discussion :

Plusieurs COUNT() sur plusieurs tables dans la même requête


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 25
    Points
    25
    Par défaut Plusieurs COUNT() sur plusieurs tables dans la même requête
    Bonjour,
    J'utilise Mysql avec PHP. Je voudrais faire une liste de statistiques qui affiche le nombre de page vues pour un pseudo ,le nombre de commentaires édités et le nombre d'article posté.

    J'y arrive facilement avec plusieurs requette :

    SELECT COUNT(*) AS nombre_pagesvues FROM pages_vues WHERE pseudo ='$q';
    SELECT COUNT(*) AS nombre_coms FROM commentaires WHERE pseudo ='$q';
    SELECT COUNT(*) AS nombre_article FROM article WHERE pseudo ='$q';

    Mais je voudrais tout regrouper en une seule requette.
    Comment puis-je faire?

    Merci de me répondre

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Il te faut mettre les trois tables en jointure sur les colonnes pseudo et faire usage d'une colonne discriminante dans les COUNT(DISTINCT PK_de_chaque_table)
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Nouveau membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 25
    Points
    25
    Par défaut Et quand une des collonnes possèdent 0 fois le pseudo ?
    Cette facon marche bien tant que toutes les tables concernées concernent au moins une fois le pseudo.
    Mais si le pseudo, par exemple, n'a pas posté d'articles, la requette affiche 0 partout meme si l'user a aussi posté des commentaires.

    Pourquoi ?

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Parce que tu n'utilises pas le bon type de jointure.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Salut,

    Est-ce que ceci ne marche pas?:


    Select a.nombre_pagesvues, b.nombre_coms, c.nombre_article

    from

    (SELECT COUNT(*) AS nombre_pagesvues FROM pages_vues WHERE pseudo ='$q' a,
    (SELECT COUNT(*) AS nombre_coms FROM commentaires WHERE pseudo ='$q' b,
    (SELECT COUNT(*) AS nombre_article FROM article WHERE pseudo ='$q' c

    A+

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Pourquoi utiliser 3 sous-requêtes très gourmandes alors que 3 LEFT JOIN entre la table users et les tables nombre_pagesvues, nombre_coms et nombre_article règleraient l'affaire ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Nouveau membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    En fait il fallait utiliser LEFT JOIN pluto que JOIN tout seul

    Merci de vos réponses !

  8. #8
    Nouveau membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 25
    Points
    25
    Par défaut Temps d'execution
    Euh en fait si on a une table de 1000 lignes à joindre, le traitement prend plus d'1s, alors qu'en plusieurs requette il est quasi instantané.

    Pourquoi ?

    Ma requette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT COUNT( DISTINCT maps.id ) AS maps, 
    COUNT( DISTINCT articles.id ) AS articles, 
    COUNT( DISTINCT coms.id ) AS coms,
    COUNT( DISTINCT pages_vues.time ) AS pages_vues
    FROM  `auth` 
    LEFT JOIN maps ON maps.add_by = auth.pseudo
    LEFT JOIN articles ON articles.pseudo = auth.pseudo
    LEFT JOIN commentaires coms ON coms.pseudo = auth.pseudo
    LEFT JOIN pages_vues ON pages_vues.pseudo = auth.pseudo
    GROUP BY auth.pseudo
    HAVING auth.pseudo= '$q'
    LIMIT 1

  9. #9
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Plus que probablement un problème d'index manquants.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  10. #10
    Nouveau membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    Oui mais je ne vais pas rajouter un index vu que la table "pages_vues" change a chaque chargement de page.

    Par contre je viens de remarquer que l'idée de Francois134 est beaucoup plus rapide à executer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select a.nombre_pagesvues AS pages_vues, b.nombre_coms AS coms, c.nombre_article AS articles,d.maps AS maps FROM
     
    (SELECT COUNT(*) AS nombre_pagesvues FROM pages_vues WHERE pseudo ='arkolos') a,
    (SELECT COUNT(*) AS nombre_coms FROM commentaires WHERE pseudo ='arkolos') b,
    (SELECT COUNT(*) AS nombre_article FROM articles WHERE pseudo ='arkolos') c,
    (SELECT COUNT(*) AS maps FROM commentaires WHERE pseudo ='arkolos') d
    (0.030s)
    Je choisit donc cette requette.

    Merci de vos réponses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mettre à jour deux tables dans la même requête
    Par phicarre dans le forum Requêtes
    Réponses: 5
    Dernier message: 31/05/2013, 14h14
  2. Réponses: 9
    Dernier message: 29/11/2012, 11h26
  3. [MySQL] Extraire plusieurs champs d'une table dans une même requête
    Par la_chouette dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/11/2012, 11h11
  4. Réponses: 9
    Dernier message: 09/11/2011, 17h57
  5. Réponses: 8
    Dernier message: 17/05/2006, 14h32

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