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 :

DISTINCT sur plusieurs tables


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 8
    Points
    8
    Par défaut DISTINCT sur plusieurs tables
    Bonjour

    voila plusieurs jours que je cherche une solution à mon problème :

    j'arrive individuellement sur chacune d'elle à avoir les résultats que je souhaite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_activites_annuelles
                JOIN activites_annuelles ON activites_annuelles.activite_id = enfants_has_activites_annuelles.activites_activite_id
    j'ai la même chose avec les tables enfants_has_clsh, enfants_has_cvl, enfants_has_activites. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_cvl
                JOIN cvl ON cvl.cvl_id = enfants_has_cvl.cvl_cvl_id
    ---
    SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_clsh
                JOIN clsh ON clsh.clsh_id = enfants_has_clsh.clsh_clsh_id
    ---
    SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_activites
                JOIN activites ON activites.activite_id = enfants_has_activites.activites_activite_id
    Mais je voudrais tirer les résultats sur l'ensemble des tables simultanément. C'est à dire notamment "COUNT(DISTINCT enfants_enfant_id)" sur les 4 tables.

    Merci d'avance à toute aide

  2. #2
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 612
    Points
    58 612
    Billets dans le blog
    11
    Par défaut
    Une solution qui n'est peut-être pas la meilleure :
    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
    SELECT 
    *
    FROM (SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_activites_annuelles
                JOIN activites_annuelles ON activites_annuelles.activite_id = enfants_has_activites_annuelles.activites_activite_id
    UNION
    SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_cvl
                JOIN cvl ON cvl.cvl_id = enfants_has_cvl.cvl_cvl_id
    UNION
    SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_clsh
                JOIN clsh ON clsh.clsh_id = enfants_has_clsh.clsh_clsh_id
    UNION
    SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_activites
                JOIN activites ON activites.activite_id = enfants_has_activites.activites_activite_id)
    ORDER BY
    	nombreEU
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    il faut un union all et non un union.

    A part ça, ca me semble une bonne solution.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci à vous deux pour cette solution.

    Mais à vrai dire je crois bien que je me suis mal exprimé.

    Le champ "enfants_enfant_id" se trouve dans les 4 tables.
    Un enfant peu donc être dans une ou plusieurs tables.
    Mon souhait est de pouvoir comptabiliser les enfants uniques (ce que j'arrive à faire sur 1 table mais pas en groupant les 4).

    Je pensais éventuellement créer un une table temporaire qui regroupe l'ensemble des infos des 4 autres tables et faire mon DISTINCT dessus.
    Mais n'y a-t-il pas une requête sql qui puisse faire le distinct en prenant en compte les 4 tables simultanément ?

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    euh,

    Votre but c'est donc juste de comptabilisé les enfants uniques ?

    Comment reconnait-on qu'un enfant est unqiue ?

    D'apres votre structure j'ai l'impression qu'il y a une forme d'héritage dans vos données.

    Présentez le modèle ?

  6. #6
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 612
    Points
    58 612
    Billets dans le blog
    11
    Par défaut
    Et en essayant quelque chose comme cela :
    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
    SELECT 
    nombreEU,
    COUNT(nombreEU) nombreEU
    FROM (SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_activites_annuelles
                JOIN activites_annuelles ON activites_annuelles.activite_id = enfants_has_activites_annuelles.activites_activite_id
    UNION ALL
    SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_cvl
                JOIN cvl ON cvl.cvl_id = enfants_has_cvl.cvl_cvl_id
    UNION ALL
    SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_clsh
                JOIN clsh ON clsh.clsh_id = enfants_has_clsh.clsh_clsh_id
    UNION ALL
    SELECT COUNT(enfants_enfant_id) AS nombreET, COUNT(DISTINCT enfants_enfant_id) AS nombreEU
                FROM enfants_has_activites
                JOIN activites ON activites.activite_id = enfants_has_activites.activites_activite_id)
    GROUP BY
    	nombreEU
    HAVING 
    	COUNT(nombreEU) = 1
    ORDER BY
    	nombreEU
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    La requête me donne "1" comme résultat...

    l'enfant est unique car son id est unique (enfants_enfant_id)

    Un enfant peut participer à différentes activités, qui sont réparties selon des types (clsh, cvl, activites, activites_annuelles)

    ainsi, un enfant peut participer à 4 activités, 2 clsh, 1 cvl et 0 activités annuelles.

    si je fais un DISTINCT sur l'ensemble je devrais le trouver 1 fois (et ainsi de suite pour l'ensemble des enfants).

    L'objectif étant de connaitre le nombre d'enfants qui ont participé et donc de ne comptabiliser qu'une fois chaque enfant. Quelques soient les activités auxquelles il a participé.

    PS.
    J'ai procédé comme suis
    1- CREATE TABLE temp
    2- je remplis ma table avec INSERT INTO temp (SELECTenfants_enfant_id FROM ...)
    3- j'extrais avec un SELECT DISTINCT
    4- DROP TABLE temp

    et ca semble fonctionner.
    Mais si vous avez plus simple ou plus efficace (pq je ralenti qq peu le chargement de ma page en procédant comme cela)

    PS2.
    J'ai pas très bien compris l'utilisation de CREATE TABLE TEMPORARY
    lorsque j'utilise ma requête SELECT, la table ne semble plus exister.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    L'objectif étant de connaitre le nombre d'enfants qui ont participé et donc de ne comptabiliser qu'une fois chaque enfant. Quelques soient les activités auxquelles il a participé.
    Connaissez-vous l'opérande EXISTS ?

    manque le modèle, et en particulier la table reliée à vos activitées côté "enfant"


    J'ai pas très bien compris l'utilisation de CREATE TABLE TEMPORARY
    lorsque j'utilise ma requête SELECT, la table ne semble plus exister.
    Y a la doc qui explique très bien ce qu'il se passe : http://dev.mysql.com/doc/refman/5.5/...ate-table.html

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    A TEMPORARY table is visible only to the current connection, and is dropped automatically when the connection is closed.
    Je vais me pencher sur ca.

    Concernant le EXISTS, je ne suis pas sur que ca corresponde a ce que je souhaite en lisant la doc.

    je vais publie le modèle de ma bdd

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Moi je comprends le besoin comme ça :
    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 count(distinct enfants_enfant_id)
      from (
    select enfants_enfant_id
      from enfants_has_activites_annuelles
     union all
    select enfants_enfant_id
      from enfants_has_cvl
     union all
    select enfants_enfant_id
      from enfants_has_clsh
     union all
    select enfants_enfant_id
      from enfants_has_activites 
           )

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Si votre but c'est uniquement de compter le nombre d'enfants qui participent à au moins une activité, c'est bien un exists qu'il faut utiliser en partant de votre table "mère" d'enfant

Discussions similaires

  1. Liste DISTINCT sur plusieur table
    Par Nako_lito dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 19/06/2008, 08h49
  2. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 19h05
  3. order by sur plusieurs tables
    Par Mad_Max dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/12/2003, 12h17
  4. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 17h50
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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