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 :

Faire le count sur 6 tables puis le trier


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Points : 62
    Points
    62
    Par défaut Faire le count sur 6 tables puis le trier
    Bonjour, j'ai beaucoup cherché sur internet mais je n'ai pas trouvé de solution voici mes données (c'est un site php) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    utilisateur(
    num_util INTEGER (8) NOT NULL PRIMARY KEY UNSIGNED AUTO_INCREMENT,
    login_util VARCHAR (20) BINARY,
    pass_util VARCHAR (20) BINARY,
    mail_util VARCHAR (50) BINARY,
    pseudo_util VARCHAR (50) BINARY,
    droit_util INTEGER (9) UNSIGNED,
    date_util TIMESTAMP (19) UNSIGNED BINARY TIMESTAMP);
    Il y a des utilisateur qui peuvent Créer 6 types de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    testing(
    num_test INTEGER (8) NOT NULL PRIMARY KEY UNSIGNED AUTO_INCREMENT,
    num_typetest INTEGER (8) NOT NULL PRIMARY KEY UNSIGNED,
    libelle_test VARCHAR (50) BINARY,
    description_test VARCHAR (500) BINARY,
    etc ...
    util_test INTEGER (8) UNSIGNED);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    materiel(
    num_mat INTEGER (8) NOT NULL PRIMARY KEY UNSIGNED AUTO_INCREMENT,
    num_typemat INTEGER (8) NOT NULL PRIMARY KEY UNSIGNED,
    num_edi INTEGER (8) NOT NULL PRIMARY KEY UNSIGNED,
    libelle_mat VARCHAR (50) BINARY,
    description_mat VARCHAR (500) BINARY,
    etc ...
    util_mat INTEGER (8) UNSIGNED);
    etc ...

    A chaque fois util_ (abrégé de la table) représente le numéro de l'utilisateur qui a créer la table, je voudrais donc savoir le nombre d'enregistrement de tout les types qu'un utilisateur a ajouté à la base de données, et ensuite les classer pour pouvoir faire un top 5 des utilisateurs qui ont le plus ajouté de tous les types.

    J'aimerais bien trouver comment faire une requête plutôt que d'enchainer 6 requête pour chaque utilisateur et de ensuite trier le tableau avec php

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Pour une table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT util_test AS Utilisateur, COUNT(*) AS Nombre
    FROM testing
    GROUP BY util_test
    Pour deux tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT Utilisateur, COUNT(*) AS NombreTotal
    FROM 
    (
      SELECT util_test AS Utilisateur, COUNT(*) AS Nombre
      FROM testing
      GROUP BY util_test
     
      UNION
     
      SELECT util_mat AS Utilisateur, COUNT(*) AS Nombre
      FROM materiel
      GROUP BY util_mat
    ) tmp
    GROUP BY Utilisateur
    Il suffit d'ajouter les UNION vers les 4 autres tables.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Pour une table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT util_test AS Utilisateur, COUNT(*) AS Nombre
    FROM testing
    GROUP BY util_test
    Pour deux tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT Utilisateur, COUNT(*) AS NombreTotal
    FROM 
    (
      SELECT util_test AS Utilisateur, COUNT(*) AS Nombre
      FROM testing
      GROUP BY util_test
     
      UNION
     
      SELECT util_mat AS Utilisateur, COUNT(*) AS Nombre
      FROM materiel
      GROUP BY util_mat
    ) tmp
    GROUP BY Utilisateur
    Il suffit d'ajouter les UNION vers les 4 autres tables.

    J'avais déjà essayé avec UNION mais sans succès,
    j'ai refait ma requête et ça me dit une fausse valeur et ça ne m'affiche qu'un seul utilisateur dans le résultat,
    Je ne comprend pas trop la manière dont on l'utilise c'est pour ça que j'ai du mal je n'ai pas du voir une erreur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    SELECT Utilisateur, COUNT(*) AS NombreTotal
    FROM 
    (
      SELECT util_test AS Utilisateur, COUNT(*) AS Nombre
      FROM testing
      GROUP BY util_test
     
      UNION
     
      SELECT util_mat AS Utilisateur, COUNT(*) AS Nombre
      FROM materiel
      GROUP BY util_mat
     
      UNION
     
      SELECT util_exam AS Utilisateur, COUNT(*) AS Nombre
      FROM examen
      GROUP BY util_exam
     
      UNION
     
      SELECT util_tfe AS Utilisateur, COUNT(*) AS Nombre
      FROM tfetude
      GROUP BY util_tfe
     
      UNION
     
      SELECT util_equi AS Utilisateur, COUNT(*) AS Nombre
      FROM equivalence
      GROUP BY util_equi
     
     
      UNION
     
      SELECT util_doc AS Utilisateur, COUNT(*) AS Nombre
      FROM documentation
      GROUP BY util_doc
    )tmp
    GROUP BY Utilisateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Utilisateur 	NombreTotal
    1 	2
    EDIT: Déjà j'ai compris tu as mis TMP pour dire que c'est une "table virtuelle temporaire"

    EDIT: J'obtiens ce résultat même en mettant des enregistrement dans toutes les tables

    EDIT: J'ai essayé comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Utilisateur, SUM(Nombre) AS NombreTotal
    J'obtiens 8 pourtant je devrais obtenir 12, j'ai essayé chaque requête dans les union et elles fonctionnent donc je ne comprend pas

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Essaie éventuellement en mettant des parenthèses autour de chaque requête.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Il faut effectivement utiliser SUM, ainsi que UNION ALL à la place de UNION tout court. C'est plus performant et surtout ça conserve les doublons...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    SELECT Utilisateur, SUM(Nombre) AS NombreTotal
    FROM 
    (
      SELECT util_test AS Utilisateur, COUNT(*) AS Nombre
      FROM testing
      GROUP BY util_test
     
      UNION ALL
     
      SELECT util_mat, COUNT(*) 
      FROM materiel
      GROUP BY util_mat
     
      UNION ALL
     
      SELECT util_exam, COUNT(*) 
      FROM examen
      GROUP BY util_exam
     
      UNION ALL
     
      SELECT util_tfe, COUNT(*)
      FROM tfetude
      GROUP BY util_tfe
     
      UNION ALL
     
      SELECT util_equi, COUNT(*)
      FROM equivalence
      GROUP BY util_equi
     
      UNION ALL
     
      SELECT util_doc, COUNT(*) 
      FROM documentation
      GROUP BY util_doc
    ) tmp
    GROUP BY Utilisateur
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Il faut effectivement utiliser SUM, ainsi que UNION ALL à la place de UNION tout court. C'est plus performant et surtout ça conserve les doublons...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    SELECT Utilisateur, SUM(Nombre) AS NombreTotal
    FROM 
    (
      SELECT util_test AS Utilisateur, COUNT(*) AS Nombre
      FROM testing
      GROUP BY util_test
     
      UNION ALL
     
      SELECT util_mat, COUNT(*) 
      FROM materiel
      GROUP BY util_mat
     
      UNION ALL
     
      SELECT util_exam, COUNT(*) 
      FROM examen
      GROUP BY util_exam
     
      UNION ALL
     
      SELECT util_tfe, COUNT(*)
      FROM tfetude
      GROUP BY util_tfe
     
      UNION ALL
     
      SELECT util_equi, COUNT(*)
      FROM equivalence
      GROUP BY util_equi
     
      UNION ALL
     
      SELECT util_doc, COUNT(*) 
      FROM documentation
      GROUP BY util_doc
    ) tmp
    GROUP BY Utilisateur

    Merci,

    J'avais pensé a UNION ALL parce que quand j'avais essayé avec UNION j'avais essayé UNION ALL mais je pensais qu'il fallait le proscrire parce que Cinephil m'a orienté vers la bonne voix sans ALL

    J'essayerais de faire une autre requête en groupant les dates maintenant
    Mais il faudra que je trouve un moyen de savoir de quel type dépend cette date, enfin bon je vais me débrouiller

    Encore merci (j'y ai pensé cette nuit )

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

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

Discussions similaires

  1. critere de selection pr faire un UPDATE sur 1 table
    Par maxizoo dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/01/2006, 16h35
  2. Requete COUNT sur 3 tables
    Par Le-Cortex dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/09/2005, 11h39
  3. Faire un Lock sur une table pendant l'exec d'un DTS
    Par Pete dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/03/2005, 15h17
  4. Somme de 3 COUNT() sur 3 tables différentes
    Par PyRoFlo dans le forum Langage SQL
    Réponses: 9
    Dernier message: 13/08/2004, 19h36
  5. 2 Count() sur deux tables en jointures gauches
    Par Alexandre T dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2003, 17h53

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