2017-08-30 20 views
0

FX。、のみを含むbasket_idを返すクエリを探して、バスケットとフルーツのテーブルを指定します。特定の2つの果物。MYSQL特定の子行のみを選択するクエリ

EX テーブル:果物

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

2   | apple 
2   | orange 

3   | apple 
3   | pear 

上記の表を考えると、私は次のようになりはONLYは果物「りんご」と「オレンジ」が含まれていることbasket_idを返すクエリ、探しています行2のみ。バスケットID 1には「梨」も含まれているため除外する必要があります。

これをお手伝いいただければ幸いです。

+0

なぜbasket_idもこのbasket_idには2つの特定の果物がありますか? –

+0

2番目の行のみを意味しますか?あなたはリンゴとオレンジの最初のエントリを含めるだろうか? – 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%OKです。何が間違っているか説明してください... –

+0

私はダウンボートしませんでしたが、バスケットにリンゴだけがある場合、それは同様に返されます。これはopが望むものではありません。 – LONG

+0

@ LONGありがとうございます。あなたは正しいです...これは修正されました。 –

2

例の表に注意してください。basket_id = 4のバスケットをもう1つ追加しました。これは2つのリンゴのみを持ち、クエリの強力なテストサンプルになります。

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にはリンゴが2つしかない場合、バスケット3も返されます。 – LONG

+0

@LONG実際には、私はまさにそれらの2つの果物を持つバスケットを探しています。それ以上はない。 – mass6

+0

バスケット3にオレンジ色のりんごが2つもない場合でも、それは返されます – 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があります。