Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 06/05/2011, 09h12   #1
Invité de passage
 
Yann Offredi
Inscription : septembre 2010
Messages : 4
Détails du profil
Informations personnelles :
Nom : Yann Offredi

Informations forums :
Inscription : septembre 2010
Messages : 4
Points : 0
Points : 0
Par défaut Problème simple et difficile à la fois

Bonjour,

Voici les conditions du problème :
Serveur mysql 5
Une table (laison_cat) de ce type :

cat l sous_cat
---------------
1   l 23
1   l 24
1   l 25
2   l 23
2   l 24
3   l 21
3   l 23
4   l 24
4   l 26
J'aimerais trouver la requête qui me permette de trouver la cat catégorie qui contient uniquement les sous catégorie 23 et 24.


Après plusieurs tests voici la solution que j'ai trouvée (attention les yeux) :

Code :
1
2
3
4
5
SELECT cat, 
            group_concat(sous_cat ORDER BY sous_cat) AS concat
FROM   laison_cat
GROUP BY cat
HAVING concat = "23,24".

C'est sur, ça fonctionne. Mais est ce la meilleur la solution?
yann.php est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 15h55   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Ca me semble bien, une autre approche moins spécifique à MySql serait :
Code :
1
2
3
4
5
6
SELECT cat,
       count(*) AS cnt,
       sum(case when sous_cat IN (23,24) then 1 end) AS nb_23_24
  FROM laison_cat
 GROUP BY cat
HAVING count(*) = sum(case when sous_cat IN (23,24) then 1 end)
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 14h43   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Il suffit de de filter les cat qui ont les sous_cat 23 et 24, de compter les sous_cat par cat, puis de ne retenir que les cat qui n'ont que deux sous_cat puisque ta liste de sous_cat à filtrer contient deux sous_cat (23 et 24) :
Code :
1
2
3
4
5
SELECT cat
FROM liaison_cat
WHERE sous_cat IN (23, 24)
GROUP BY cat
HAVING COUNT(*) = 2
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/05/2011, 21h04   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Il suffit de de filter les cat qui ont les sous_cat 23 et 24, de compter les sous_cat par cat, puis de ne retenir que les cat qui n'ont que deux sous_cat puisque ta liste de sous_cat à filtrer contient deux sous_cat (23 et 24) :
Oui, en plus ma requête est fausse, si une cat n'a qu'une sous-cat à 23 ou à 24 alors elle remonte aussi
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 08h54   #5
Invité de passage
 
Yann Offredi
Inscription : septembre 2010
Messages : 4
Détails du profil
Informations personnelles :
Nom : Yann Offredi

Informations forums :
Inscription : septembre 2010
Messages : 4
Points : 0
Points : 0
Citation:
Code :
1
2
3
4
5
SELECT cat
FROM liaison_cat
WHERE sous_cat IN (23, 24)
GROUP BY cat
HAVING COUNT(*) = 2
Le souci de cette requête c'est qu'elle me retourne la cat : 1. qui contient bien 23 et 24 mais au aussi 25.

une autre idée ?
yann.php est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 11h46   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Essaye comme ça, peut-être
Code sql :
1
2
3
4
5
SELECT cat
SUM(IF(sous_cat IN (23, 24),1,0)) AS duo
FROM liaison_cat
GROUP BY cat
HAVING duo = 2 AND duo=COUNT(*)
__________________
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)
Maljuna Kris est dé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 09h02.


 
 
 
 
Partenaires

Hébergement Web