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

Langage SQL Discussion :

Requête sur unicité


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut Requête sur unicité
    Soit le schema suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    MarqueVoiture
      mv_id
     
    Personne
      p_id
      mv_id
     
    GroupPersonne
      p_id
      g_id
     
    Group
      g_id
    Une voiture peut appartenir a plusieurs personnes

    Je souhaite faire une requête qui pour chaque groupe, retrournerait le nombre marque de voitures qu'on ne trouve QUE dans chaque groupe (et donc pas dans les autres groupes). Bien qu'elle me semble simple en apparance, je n'ai toujours pas trouvé de solution.

    J'en suis ici:
    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 G.name, COUNT(*) FROM Group G
    JOIN GroupPersonne GP
        ON G.g_id=GP.g_id
    JOIN (
            SELECT p_id, g_id
            FROM GroupPersonne
            JOIN Personne ON Personne.p_id=GroupPersonne.p_id
            GROUP BY
                    mv_id
            HAVING COUNT(*) = 1
         ) JO 
         ON JO.p_id=GP.p_id
    GROUP BY G.g_id
    Mais je ne m'étendrai pas sur cette requête, elle ne fait pas le job... Et impossible d'avancer (fin de semaine ?)

    Si quelqu'un à une idée
    Merci d'avance!

  2. #2
    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
    bonjour,

    Ce serai cool de préciser le sgbd.

    M'enfin vu votre sous-requête group by horrible je penses que vous êtes sous MySql :p

    Donc j'ai ceci qui devrait répondre au besoin mais je trouve ca un peu trop bourrin comme approche :

    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
     
    select g_id, g_name, count(*)
    from (
    	select distinct gp.g_id, g_name, per.mv_id
    	from GroupPersonne gp
    	inner join Group g on gp.g_id = g.g_id
    	inner join Personne per on per.p_id = gp.p_id 
    	) lst_gp
    inner join (
    	select mv_id 
    	from (
    	select distinct gp.g_id, per.mv_id
    	from GroupPersonne gp
    	inner join Personne per on per.p_id = gp.p_id) lst_gp_mv
    	group by mv_id
    	having count(*) = 1) lst_mv on lst_mv.mv_id = lst_gp.mv_id
    group by g_id, g_name

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Effectivement cela fonctionne, merci de ta réponse J'ai pu du coup trouver une requête un poil plus simple je crois, en tout cas cela semble fonctionner:
    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
     
    SELECT G.g_name, COUNT(*)
    FROM Group G
    JOIN (
            SELECT g_id, mv_id FROM  (
                SELECT mv_id, g_id
                FROM Voiture V
                JOIN GroupPersonne GP ON GP.v_id=V.v_id
                GROUP BY
                    mv_id, g_id
            ) JT 
            GROUP BY JT.mv_id HAVING COUNT(*) = 1
        ) JP
        ON G.g_id=JP.g_id
    GROUP BY G.g_name
    Ca semble toujours un peu hardcore mais je n'ai pas mieux pour le moment et toute suggestion / commentaire sera bienvenu !

    Deux question tout de même quant à tes remarques, en précisant que je suis loin d'être spécialiste du SQL (j'en fais usage occasionellement) :

    1. Pourquoi ma sous-requête group by te semble horrible ?
    2. Pourquoi ce coté horrible tu l'associe à MySQL (que j'utilise effectivement) ? Il me semblait que ma requête était relativement portable...

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Est-ce que ça fonctionne avec cette requête:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select group.g_id,count(distinct Personne.mv_id)
    from Group
    inner join GroupPersonne on GroupPersonne.g_id = Groupe.g_Id
    inner join Personne on Personne.p_Id = GroupPersonne.p_Id
    left outer join personne p2 on p2.mv_id = personne.mv_id and p2.g_id <> GroupPersonne.g_id
    where p2.p_id is null
    group by group.g_id
    En gros j'ai traduit la demande ainsi :
    Pour chaque groupe, je compte les marques pour lesquelles il n'y a pas de personne d'un autre groupe ayant la même marque. Ici j'ignore aussi la marque si la personne en question est dans 2 groupes.

    Tatayo.

Discussions similaires

  1. [ADO] Requète sur dates
    Par cdlr27 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/01/2005, 22h39
  2. Requête sur un MemData
    Par claude dans le forum Bases de données
    Réponses: 5
    Dernier message: 23/12/2004, 10h11
  3. Requête sur date
    Par guenfood dans le forum Access
    Réponses: 11
    Dernier message: 08/12/2004, 16h11
  4. Requête sur un serveur lié
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/08/2003, 11h35
  5. requête sur l'année d'une date
    Par jo77 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/07/2003, 09h28

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