Extraction mulitples sur un champ

Extraction mulitples sur un champ - SQL/NoSQL - Programmation

Marsh Posté le 16-11-2010 à 14:28:48    

bonjour
 
j'ai une table présentée comme telle.
 
film | personne
--------------------
1 | Eric
1 | Samuel
2 | Eric
3 | Eric
5 | Samuel
 
je voudrais faire un SELECT personne avec un WHERE avec films 1,2 et 3 pour qu'il m'affiche la seule personne qui a les 3 films, soit "Eric"
 
comment rédiger ma requête ?

Reply

Marsh Posté le 16-11-2010 à 14:28:48   

Reply

Marsh Posté le 16-11-2010 à 14:42:07    

Quel SGBD?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-11-2010 à 14:50:08    

mysql

 

j'ai pensé à faire un truc du genre

 
Code :
  1. SELECT personne FROM table WHERE film = 1 AND film = 2 AND film = 3
 

mais évidemment, ça me sort aucun enregistrement.

Message cité 1 fois
Message édité par sebnutt le 16-11-2010 à 14:51:37
Reply

Marsh Posté le 16-11-2010 à 15:06:55    

sebnutt a écrit :

mysql

 

j'ai pensé à faire un truc du genre

 
Code :
  1. SELECT personne FROM table WHERE film = 1 AND film = 2 AND film = 3
 

mais évidemment, ça me sort aucun enregistrement.

 

Ceci devrait pouvoir fonctionner (si tu n'as pas de doublons sur (personne, film) dans ta table) :

 

select personne, count(*)
from table
where film in (1, 2, 3)
group by personne
having count(*) = 3;


Message édité par skeye le 16-11-2010 à 15:07:17

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-11-2010 à 15:18:28    

il me sort

 

Eric
Samuel

 

on dirait que le film in (1,2,3) utilise un OR par défaut, soit l'équivalent de
SELECT personne FROM table WHERE film = 1 OR film = 2 OR film = 3

 

il me faudrait la meme requete mais je veux sortir la ou les personnes qui ont forcément tous les films spécifiés


Message édité par sebnutt le 16-11-2010 à 15:20:26
Reply

Marsh Posté le 16-11-2010 à 15:20:38    

Hein?
Samuel n'apparait que 2 fois dans ta table...tu as bien mis le having?[:autobot]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-11-2010 à 15:32:19    

C'est bon, j'ai réussi à l'adapter. T'es un bon !
un grand merci.

Reply

Marsh Posté le 16-11-2010 à 15:56:13    

juste un truc par contre si je fais
 
select personne
from table
where film in (1,5)
group by personne
having count(*) = 2;  
 
ca me sort les deux noms parce que l'un et l'autre ont au moins 2 films dans la liste.
comment ne récupérer que ceux qui ont les X films correspondant au nombre choisis ? pas ce qui sont <= X mais ceux qui sont = X ??

Reply

Marsh Posté le 16-11-2010 à 15:59:10    

sebnutt a écrit :

juste un truc par contre si je fais
 
select personne
from table
where film in (1,5)
group by personne
having count(*) = 2;  
 
ca me sort les deux noms parce que l'un et l'autre ont au moins 2 films dans la liste.


ça ne correspond pas à ton jeu de données du départ, ça.
Tu ne devrais pas avoir Eric, qui n'a qu'un film parmi (1,5)...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-11-2010 à 16:11:18    

le where film in (1,5) indique que personne doit avoir forcément 1 et 5 / ou bien 1 ou 5 pour apparaitre dans le résultat du select ?

Reply

Marsh Posté le 16-11-2010 à 16:11:18   

Reply

Marsh Posté le 16-11-2010 à 16:15:20    

sebnutt a écrit :

le where film in (1,5) indique que personne doit avoir forcément 1 et 5 / ou bien 1 ou 5 pour apparaitre dans le résultat du select ?


Cela indique qu'on ne garde que les lignes pour lesquelles film vaut soit 1, soit 5.
Ensuite via le count(*) / group by on compte pour chaque personne combien de lignes cela retourne.
Et via le having on indique qu'on ne garde que les personnes pour lesquelles le nombre de lignes correspond au nombre de films attendus.
 
D'ailleurs il manque le count(*) dans ton select, c'est normal?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-11-2010 à 16:28:17    

euh je pensais ne pas en avoir besoin, alors je l'ai enlevé... je vais essayé avec
edit : ca change rien.
re-edit : ca marche nickel en mettant le count(*) maintenant que j'ai eu ton explication pas à pas.

 

encore merci


Message édité par sebnutt le 17-11-2010 à 09:52:23
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed