Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels 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 26/01/2012, 22h54   #1
Membre du Club
 
Avatar de yvesall
 
Développeur de jeux vidéo
Inscription : novembre 2006
Messages : 197
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur de jeux vidéo
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2006
Messages : 197
Points : 67
Points : 67
Par défaut Filtre sur colonne

Hello !

D'habitude je me débrouille pour faire des requêtes qui me retourne le bon résultat mais là je n'y arrive vraiment pas.
Je souhaite récupérer une valeur bien précise en une seule requête

malheureusement mon manque de connaissance en SQL me limite fortement :/

Donc j'ai un tableau
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
+----------------------+
| Titre     | loginId  |
+----------------------+
| "ABC"     | 1        |
+----------------------+
| "ABC"     | 2        |
+----------------------+
| "BCD"     | 2        |
+----------------------+
| "BCD"     | 3        |
+----------------------+
| "EFG"     | 1        |
+----------------------+
Je souhaite simplement récupéré le Titre qui n'est pas associé avec le loginId 1 (ici ça serait "BCD")
En réalité ma table est un peu plus complexe

mais rien que ce cas "simple" je n'y arrive pas

Sauriez vous comment faire ?

Merci
__________________
i = i++;
yvesall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 09h16   #2
Membre Expert
 
Homme
Inscription : mai 2002
Messages : 1 218
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 218
Points : 1 913
Points : 1 913
Bonjour,

Utilisez un not exists http://sqlpro.developpez.com/cours/s...quetes/#L1.5.1
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 09h39   #3
Membre du Club
 
Avatar de yvesall
 
Développeur de jeux vidéo
Inscription : novembre 2006
Messages : 197
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur de jeux vidéo
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2006
Messages : 197
Points : 67
Points : 67
salut !

merci pour ta réponse
en lisant sommairement (je fais des testes avec NOT EXISTS dans 2 minutes :p) il semble que ce soit finalement au moins 2 requêtes imbriquées pour arriver à mes fins ?

il n'y a donc pas moyen en 1 seul SELECT ?
__________________
i = i++;
yvesall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 09h57   #4
Membre Expert
 
Homme
Inscription : mai 2002
Messages : 1 218
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 218
Points : 1 913
Points : 1 913
Oui, avec une sous requête.

Je ne vois pas trop le problème en fait ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 10h37   #5
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 141
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 141
Points : 210
Points : 210
Code :
1
2
3
4
SELECT titre
FROM T
GROUP BY titre 
HAVING sum ( case loginId when 1 then 1 else 0 end) = 0
te donnera TOUS les titres qui ne sont pas affectés au loginId = 1
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/01/2012, 11h24   #6
Membre Expert
 
Homme
Inscription : mai 2002
Messages : 1 218
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 218
Points : 1 913
Points : 1 913
manque la comparaison sur le libellé

Dernière modification par punkoff ; 27/01/2012 à 13h51.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 13h03   #7
Membre du Club
 
Avatar de yvesall
 
Développeur de jeux vidéo
Inscription : novembre 2006
Messages : 197
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur de jeux vidéo
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2006
Messages : 197
Points : 67
Points : 67
Citation:
Envoyé par punkoff Voir le message
Oui, avec une sous requête.

Je ne vois pas trop le problème en fait ?
Il n'y a pas réellement de problème, je tente juste toujours de faire le minimum de requêtes.

Jean.Cri1 > Merci faut que je test ça

punkoff > Que manque-t-il ?

Je fais un retour sous peu
__________________
i = i++;
yvesall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 13h46   #8
Membre Expert
 
Homme
Inscription : mai 2002
Messages : 1 218
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 218
Points : 1 913
Points : 1 913
Citation:
Envoyé par yvesall Voir le message
punkoff > Que manque-t-il ?
Rien en fait, j'ai lu trop vite sa requête.
Elle devrait marcher à merveille.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 09h57   #9
Membre du Club
 
Avatar de yvesall
 
Développeur de jeux vidéo
Inscription : novembre 2006
Messages : 197
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur de jeux vidéo
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2006
Messages : 197
Points : 67
Points : 67
Citation:
Envoyé par Jean.Cri1 Voir le message
Code :
1
2
3
4
SELECT titre
FROM T
GROUP BY titre 
HAVING sum ( case loginId when 1 then 1 else 0 end) = 0
te donnera TOUS les titres qui ne sont pas affectés au loginId = 1
Et bien après test en effet ça marche !

Juste une petite rectification, il semblerait que l'espace entre "SUM" et '(' ne doive pas exister pour que la syntaxe soit valide
c'est à dire :
Code :
1
2
3
4
SELECT titre
FROM tableName
GROUP BY titre 
HAVING SUM(CASE loginId WHEN 1 THEN 1 ELSE 0 END)=0;
Puisque je me suis demandé comment cela fonctionnait et que je suppose avoir compris, je me permet d'expliquer en détail aux débutants comme moi :
(corrigez moi si je me trompe )

Le HAVING conditionne le résultat de GROUP BY par ce qui le suit.
Ce qui le suit est un résultat booléen et non une somme puisque le code est
Notez le "=0" qui transforme le résultat en booléen

Là où la syntaxe m'a travaillé le plus c'est au niveau du statement CASE
Cette commande ajoute à la fonction statistique SUM une structure conditionnelle.
Pour chaque itération du HAVING, le CASE va vérifier si loginID vaut 1 grâce à :
si c'est le cas, il retourne la valeur 1 qui sera additionnée dans la somme
grâce à :
sinon il retourne la valeur 0 ne modifiant pas la somme.
Le resultat de la somme est comparé à la constante 0 pour retourner un booléen et ainsi valider l’itération du HAVING.


Merci encore Punkoff et Jean.Cri1 !
__________________
i = i++;

Dernière modification par yvesall ; 28/01/2012 à 10h01. Motif: correction de paragraphe
yvesall est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 23h07.


 
 
 
 
Partenaires

Hébergement Web