2017-08-30 59 views
0

FX。,給定籃子和水果的表格,查找返回包含僅限於這兩個特定水果的basket_id。需要MYSQL查詢才能選擇特定的子行

EX 表:水果

basket_id | fruit 
_________________ 
1   | apple 
1   | orange 
1   | pear 

2   | apple 
2   | orange 

3   | apple 
3   | pear 

鑑於上述情況表,我正在尋找一個查詢,返回的basket_id是ONLY包含水果「蘋果」和「橘子」,這將是第2行。應該排除籃子ID 1,因爲它也包含「梨子」。

幫助與此將不勝感激。

+0

爲什麼不是籃子3還這個basket_id也有兩個特定的水果? –

+0

第二排只意味着什麼?你會包括第一次進入蘋果和橘子嗎? – Harsh

回答

-1
SELECT DISTINCT(basket_id) 
FROM basket 
where fruit IN ('apple', 'orange'); 
0
SELECT DISTINCT basket_id 
FROM fruits f 
WHERE 
    NOT EXISTS (SELECT 1 FROM fruits f1 WHERE f.basket_id=f1.basket_id AND f1.fruit NOT IN ('apple', 'orange')) 
AND 
    (SELECT count(*) FROM fruits f2 WHERE f.basket_id=f2.basket_id AND f2.fruit='apple')=1 
AND 
    (SELECT count(*) FROM fruits f3 WHERE f.basket_id=f3.basket_id AND f3.fruit='orange')=1; 

我已經測試你的例子查詢。 Demo

+0

不知道你爲什麼downvoting這個答案傢伙。該查詢是100%確定。請解釋什麼是錯的... –

+0

我沒有downvote,但如果有一個籃子只有蘋果,它會返回以及,這不是什麼操作。 – LONG

+0

@LONG謝謝。你是對的......這已被糾正。 –

2

請注意,對於示例表,我添加了一個basket_id = 4的籃子,它只有兩個蘋果,它將成爲查詢的強大測試樣本。

WITH ABC --sample table 
AS 
(
SELECT 1 as basket_id, 'Apple' as fruit 
UNION ALL 
SELECT 1 as basket_id, 'Orange' as fruit 
UNION ALL 
SELECT 1 as basket_id, 'Pear' as fruit 
UNION ALL 
SELECT 2 as basket_id, 'Apple' as fruit 
UNION ALL 
SELECT 2 as basket_id, 'Orange' as fruit 
UNION ALL 
SELECT 3 as basket_id, 'Apple' as fruit 
UNION ALL 
SELECT 3 as basket_id, 'Pear' as fruit 
UNION ALL 
SELECT 4 as basket_id, 'Apple' as fruit 
UNION ALL 
SELECT 4 as basket_id, 'Apple' as fruit 
) 
--main query: 
SELECT basket_id FROM 
(
SELECT *,CASE WHEN fruit in ('Apple','Orange') THEN 1 ELSE 0 END AS row_check 
FROM ABC 
) as A 
GROUP BY basket_id 
HAVING COUNT(DISTINCT row_check) =1 -- make sure there is no other fruit 
AND COUNT(DISTINCT fruit) >1 -- make sure there are at least one apple and one orange 

輸出:basket_id 2

1
select 
    f.basket_id, 
    (select count(1) from fruits where basket_id = f.basket_id) as fruits_in_basket, 
    (select count(1) from fruits where basket_id = f.basket_id and fruit in ("apple", "orange")) as specific_fruits_in_basket 
from 
    fruits as f 
group by f.basket_id 
having fruits_in_basket = specific_fruits_in_basket 

這裏是一個小提琴:http://sqlfiddle.com/#!9/f4ae3c/37/0

+0

,籃子3也會返回,這正是我們想要的。 – LONG

+0

@LONG其實,沒有。我正在尋找一個有這兩個水果的籃子。沒有更多,不少。 – mass6

+0

如果籃子3沒有橘子,但有兩個蘋果,它仍然會返回 – LONG

0

如果可以使用的項目列表,你要選擇一個有序列表像'apple,orange',那麼你可以使用以下。

SELECT f.basket_id, f.fruit 
FROM fruits f 
    INNER JOIN (
     SELECT basket_id, GROUP_CONCAT(fruit order by fruit) as a 
     FROM fruits 
     GROUP BY basket_id 
     HAVING a = 'apple,orange' 
    ) f1 ON f.basket_id = f1.basket_id 

這裏是fiddle