2009-08-16 7 views
0

J'ai une table d'employés et leur emploi du temps, comme si:requête MySQL pour tous les termes de recherche dans l'index

Emp_Name | Date 
-------- ----- 
Smith | 08-01-2009 
Jones | 08-01-2009 
Goodman | 08-02-2009 
Smith | 08-02-2009 
Jones | 08-02-2009 
Goodman | 08-03-2009 

Comment pourrais-je écrire une requête afin que les résultats étaient seuls les noms des employés des employés travaillant sur 08-02-2009 et 08-03-2009. Je me fais prendre parce que tout ce que je peux penser sont des moyens d'obtenir les noms pour l'un ou l'autre match, mais je n'arrive pas à trouver la bonne façon d'obtenir les résultats pour seulement les noms qui correspondent à tous rechercher des critères sur plusieurs lignes. Donc, sur la base des conditions de l'exemple, je ne devrais obtenir que Goodman. Mais si je fais une requête comme WHERE Date IS (list of dates) j'obtiendrais Goodman et Smith et Jones, puisque Smith et Jones travaillent tous les deux le 08-02-2009. Si j'essaie de faire une sorte de JOIN, je ne finirais pas toujours par des colonnes égales, puisque le nombre de jours travaillés par chaque employé est variable. Je pensais que Union pourrait être la voie à suivre, mais je ne saurais pas toujours comment les conditions de recherche de quelqu'un.

Répondre

2

Voilà mon premier coup de couteau à elle, il y a probablement un moyen plus efficace que d'utiliser si ... AVOIR

SELECT Emp_Name,COUNT(DISTINCT date) as daycount 
FROM employee 
WHERE date IN ('08-01-2009', '08-02-2009') 
GROUP BY Emp_Name 
HAVING daycount=2 
+0

Pas besoin de sélectionner le nombre et vous pouvez utiliser un IN au lieu de l'OU, mais je pense que c'est aussi bon que vous pouvez obtenir –

+0

J'ai mis le compte dans la sortie car je pensais qu'il illustrerait ce qui se passait. Vous écrivez à propos de l'utilisation de IN, l'avez modifié. –

+0

Existe-t-il un moyen de transmettre le nombre de paramètres de recherche en tant que variable à la partie HAVING (en dehors de l'écriture de scripts à l'extérieur de la requête)? C'est vraiment bien, au fait. – Anthony

0

Si vous n'avez pas besoin d'une solution générique, vous pouvez utiliser ceci:

select Emp_Name 
from employee 
where Emp_Name 
    in (select Emp_Name from employee where Date = '08-02-2009') 
    and in (select Emp_Name from employee where Date = '08-03-2009') 
    ... 
+0

J'ai pensé à quelque chose comme ça. Le seul problème est qu'il devient maladroit si je ne connais pas le nombre de dates à l'avance. Je devrais écrire la requête en morceaux. Ce qui n'est pas tragique, j'ai juste pensé qu'il y avait un moyen de faire ce type de requête natif de MySQL. – Anthony

Questions connexes