2009-08-16 3 views
0

У меня есть таблица сотрудников и их расписание, как так:MySQL запросов для всех поисковых терминов в индексе

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 

Как бы написать запрос так, чтобы результаты были только имена сотрудников сотрудников, работающих на 08-02-2009 и 08-03-2009.

Я догоняю, потому что все, что я могу придумать, это способы получить имена для соответствия EITHER, но я не могу найти правильный способ получить результаты только для имен, имеющих совпадения для всех критерии поиска по нескольким строкам.

Так что, основываясь на условиях примера, я должен получить только Goodman. Но если я сделаю такой запрос, как WHERE Date IS (list of dates), я бы получил Goodman и Smith and Jones, так как Смит и Джонс работали 08-02-2009. Если я попытаюсь сделать какой-то JOIN, я бы не всегда получал равные столбцы, так как количество дней, в течение которых каждый сотрудник работает, является переменным.

Я думал, что Союз может быть путем, но я не всегда буду знать, как могут условия, которые кто-то ищет.

ответ

2

Вот мой первый удар в этом, есть, вероятно, более эффективный способ, чем при использовании HAVING, хотя ...

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

Не нужно выбирать счетчик, и вы можете использовать IN вместо OR, но я думаю, что это так же хорошо, как вы можете получить –

+0

Я помещаю счет в вывод, поскольку я думал, что это проиллюстрирует, что происходит. Вы пишете об использовании IN, хотя, изменили его. –

+0

Есть ли способ передать количество параметров поиска в качестве переменной в часть HAVING (вне сценариев, внешних по отношению к запросу)? Кстати, это действительно хорошо. – Anthony

0

Если вам не нужно общее решение, вы можете использовать это:

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

Я подумал о чем-то подобном. Единственная проблема заключается в том, что она становится неуклюжей, если я не знаю количество дат впереди. Я должен был бы выполнить запрос по частям. Что не является трагическим, я просто подумал, что есть способ сделать этот тип запросов, родным для MySQL. – Anthony