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 15/04/2011, 16h08   #1
Membre éclairé
 
Mickael
Inscription : mai 2010
Messages : 247
Détails du profil
Informations personnelles :
Nom : Mickael
Âge : 24
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mai 2010
Messages : 247
Points : 348
Points : 348
Par défaut Ecriture requête sur plusieurs lignes

Bonjour à tous,

J'aurais besoin de votre aide pour la syntaxe d'une requête SQL. Voici mon problème :

- Je possède une table de la forme
Citation:
ID_Candidat......ID_Langue
.......1....................1
.......1....................2
.......1....................3
.......2....................1
.......2....................3
.......3....................2
en français, ce que j'aimerais se dirait par

- "Quelles sont les ID des candidats sachant parler le langage 1 et 3 ?"
=> réponses : candidats 1 et 2
- "Quelles sont les ID des candidats sachant parler le langage 1,2 et 3 ?"
=> réponses : candidat 1

J'ai tenté les requêtes suivantes :
Code :
1
2
3
4
5
6
7
 
SELECT ID_Candidat FROM MaTable WHERE ID_Langue = 1 OR ID_Langue = 3
/* j’obtiens la liste de ceux qui parlent au moins un de ces langages, ce qui n'est pas ce que je souhaite */.
SELECT ID_Candidat FROM MaTable WHERE ID_Langue IN (1,3)
/* qui comme je m'en doutais fait exactement la même chose que précédemment */
SELECT ID_Candidat FROM MaTable WHERE ID_Langue = 1 AND ID_Langue = 3
/* qui ne renvoie aucun résultat car en soit, aucun ID_Langue ne vaut à la fois 1 et 3... */
Quelqu'un aurait-il une petite idée ?
__________________
C'est en aidant les autres qu'on en apprend beaucoup soi-même
michon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 17h47   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,



Code SQL :
1
2
3
4
5
6
 
SELECT ID_Candidat
FROM MaTable
WHERE ID_Langue IN (1,2,3)
GROUP BY ID_Candidat
HAVING COUNT(*) = 3 --nombre d'elements dans la liste

Cette methode ne fonctionnera pas si vous avez plusieurs fois la meme combinaison ID_Candidat/ID_Langue; Mettez une contrainte d'unicité sur ces deux colonnes (ou sinon il faut faire COUNT(DISTINCT ID_Langue) = 3)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/04/2011, 17h48   #3
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
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 081
Points : 1 875
Points : 1 875
Bonjour,
Pour la première:
Code SQL :
1
2
 
SELECT ID_Candidat,count(*) FROM MaTable WHERE ID_Langue IN (1,3) GROUP BY ID_Candidat HAVING count(*) = 2

Je te laisse chercher pour la deuxième

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/04/2011, 19h24   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par aieeeuuuuu Voir le message
Cette methode ne fonctionnera pas si vous avez plusieurs fois la meme combinaison ID_Candidat/ID_Langue; Mettez une contrainte d'unicité sur ces deux colonnes (ou sinon il faut faire COUNT(DISTINCT ID_Langue) = 3)
Autant écrire la bonne requête dès le début non ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 09h26   #5
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
D'accord avec aieeeuuuuu ...si le modèle permet de se passer de ce surcoût
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2011, 08h56   #6
Membre éclairé
 
Mickael
Inscription : mai 2010
Messages : 247
Détails du profil
Informations personnelles :
Nom : Mickael
Âge : 24
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mai 2010
Messages : 247
Points : 348
Points : 348
Merci à tous pour vos réponses. Mon expérience SQL ne date que de quelques jours et j'y vois désormais plus clair.

Dans mon système, les couples "ID_Candidat/ID_Langues" sont en effet uniques. Logiciellement parlant il est impossible d'obtenir plusieurs entrées identiques, mais comme vous l'avez suggéré, il faut en effet que je déclare ces couples uniques dans ma base pour me prevenir d'un éventuel mauvais usage.

Bon dimanche à tous !
__________________
C'est en aidant les autres qu'on en apprend beaucoup soi-même
michon 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 +2. Il est actuellement 03h16.


 
 
 
 
Partenaires

Hébergement Web