2013-08-29 3 views
-3

Нужна помощь в выборе запроса. У меня есть БД, которая хранит элементы счета. Таким образом, счет-фактура может иметь несколько элементов.Выберите строки, которые имеют следующие значения

id invoice_id product_id 
1  123   1 
2  123   2 
3  123   3 
4  123   5 
5  124   1  
6  124   2

Что мне нужно - это запрос, который возвращает все счета-фактуры, у которых product_id равен 1,2,3. Значение, если счет 123 имеет продукты 1,2,3 и 5, он также должен содержать не менее 1,2,3

Таким образом, запрос должен возвращать только первые 4 строки, потому что счет-фактура № 123 имеет продукты 1, 2,3 независимо от того, каких других продуктов он может иметь

id invoice_id product_id 
1  123   1 
2  123   2 
3  123   3 
4  123   5
+1

Обновите свой вопрос вопросом, который у вас есть сейчас, и почему он не работает. – Kermit

ответ

4

Если вы хотите вернуть все invoice_ids, что есть продукты, 1, 2 и 3, то вы хотите посмотреть на использование HAVING условия, аналогичного следующему:

select invoice_id 
from yourtable 
where product_id in (1, 2, 3) 
group by invoice_id 
having count(distinct product_id) >= 3 

Использование предложения WHERE fi lter вы можете вернуть те, которые вам нужны (1, 2, 3), но затем добавить предложение HAVING, вы добавите еще один фильтр, чтобы вернуть эти строки с отличным количеством идентификаторов продукта больше 3.

Если вы то хочет вернуть все детали, которые можно использовать следующий запрос, чтобы получить результат:

select id, invoice_id, product_id 
from yourtable 
where invoice_id in (select invoice_id 
        from yourtable 
        where product_id in (1, 2, 3) 
        group by invoice_id 
        having count(distinct product_id) >= 3); 

См SQL Fiddle with Demo

+0

Спасибо, ребята! Понял! – user2730681

0

Используйте подзапрос для выбора счета-фактуры идентификаторов, которые содержат продукты, которые вы заинтересованы затем используйте результаты этого, чтобы выбрать один и тот же идентификатор счета вместе со всеми продуктами, связанными с этими ID's:

SELECT id, invoice_id, productid 
FROM invoices 
WHERE invoice_id IN (SELECT invoice_id 
        FROM invoices 
        WHERE product_id IN (1, 2, 3) 
        GROUP BY invoice_id)