mysql search - вернуть идентификатор, только если он присутствует во всех условиях - PullRequest
0 голосов
/ 11 января 2011

У меня есть таблица для участников и таблица для услуг , которую каждый участник предоставляет:

MemberID | ServiceID
--------------
1        | 2
1        | 3
2        | 1
2        | 3

Таким образом, участник может предоставить любое количество услуг. У меня есть форма поиска, которая позволяет пользователю проверить некоторые или все услуги. Я хочу иметь возможность выбрать всех участников, которые предоставляют ВСЕ услуги, которые выбрал пользователь (а не только некоторые из них). Я использовал WHERE ... IN.., но он возвращает всех участников, которые предоставляют хотя бы одну из выбранных услуг. Теперь у меня есть запрос, похожий на:

SELECT members.id
FROM 
members
LEFT JOIN services ON (members.id=services.memberID)
WHERE members.id IN (....)

Любая помощь? Спасибо

Ответы [ 3 ]

0 голосов
/ 11 января 2011

Похоже, проблема заключается в соединении LEFT и факте проверки members.id в предложении where («выберите всех участников, которые предоставляют ВСЕ услуги, выбранные пользователем», поэтому вам следует проверитьпо servicesID):

SELECT members.id
FROM 
members
JOIN services ON (members.id=services.memberID)
WHERE servicesID IN (....)
0 голосов
/ 11 января 2011

Я действительно использую вариант этого вопроса, когда я даю интервью (спасибо, что пришли, мистер Ант, мы сообщим вам, если решим двигаться дальше).Если количество сервисов небольшое:

select s1.member_id from services s1, services s2, services s3
where s1.member_id = s2.member_id and s2.member_id = s3.member_id
and s1.service_id = 1 and s2.service_id = 2 and s3.service_id = 3

Если количество сервисов неоправданно велико, но member_id, service_id уникален

select member_id from services group by member_id having count(*) = 100;

(при наличии 100 сервисов).В худшем случае (без гарантии уникальности):

select member_id from services group by member_id having count(distinct service_id) = 100;

Что медленно, но работает.

0 голосов
/ 11 января 2011

Если я правильно понимаю ваш вопрос, это должно сработать:

SELECT memberID
FROM services
WHERE ServiceID IN (...)
GROUP BY memberID
HAVING COUNT(*) = x;

где (...) - список всех выбранных идентификаторов услуг, а x - количество элементов в (...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...