Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/10/2011, 10h49   #1
Membre habitué
 
Inscription : janvier 2005
Messages : 488
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 488
Points : 130
Points : 130
Par défaut Requête sur unicité

Soit le schema suivant:
Code :
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 :
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!
vinzzzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 11h27   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 641
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 641
Points : 2 634
Points : 2 634
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 :
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
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/10/2011, 15h16   #3
Membre habitué
 
Inscription : janvier 2005
Messages : 488
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 488
Points : 130
Points : 130
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 :
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...
vinzzzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2011, 15h44   #4
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 092
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 092
Points : 1 898
Points : 1 898
Bonjour,
Est-ce que ça fonctionne avec cette requête:
Code SQL :
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.
tatayo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h06.


 
 
 
 
Partenaires

Hébergement Web