2014-01-09 5 views
3

У меня есть структура таблицы вроде этого:Извлечение данных из таблицы отображения

bundle_id|service_id 

8|1 

8|2 

8|3 

9|1 

9|4 

10|1 

10|2 

10|3 

10|4 

10|5 

Теперь я хочу, чтобы запросить таблицу, чтобы извлечь оптимальный пакет, который имеет определенный набор услуг.

E.g. Если я хочу получить пакет, имеющий службы 1,2 и 3, он должен вернуть 8 (а не 10). Может ли кто-нибудь помочь мне с запросом?

ответ

1

Попробуйте это:

SELECT bundle_id 
FROM mappings 
WHERE service_id IN (1, 2, 3) 
GROUP BY bundle_id HAVING COUNT(DISTINCT service_id) = 3 
ORDER BY bundle_id LIMIT 1; 

EDIT

SELECT m.bundle_id 
FROM mappings m 
INNER JOIN (SELECT bundle_id, COUNT(DISTINCT service_id) serviceIdCnt 
      FROM mappings GROUP BY bundle_id 
     ) A ON m.bundle_id = A.bundle_id 
WHERE m.service_id IN (1, 2, 3) 
GROUP BY m.bundle_id HAVING COUNT(DISTINCT m.service_id) = 3 
ORDER BY A.serviceIdCnt LIMIT 1; 

Проверить SQL FIDDLE DEMO

ВЫВОД

| BUNDLE_ID | 
|-----------| 
|   8 | 
+0

Спасибо за ответ. Я попробовал тот же запрос. проблема с этим запросом заключается в том, что, скажем, если в таблице есть еще одна запись с 9 | 5, тогда будет рассмотрен и расслоение 9, так как запрос IN будет оцениваться как условия OR. –

+0

@DarshanMehta Можете ли вы добавить 'FIDDLE DEMO', чтобы понять проблему, о которой вы говорите? –

+0

http://sqlfiddle.com/#!2/d0d9d/ –

Смежные вопросы