2016-08-06 10 views
1

をフラグ付き:MySQLの選択項目は、私は次のような状況がある

Pets 
petId | name | option | optionAvail 
------+------+--------+------------ 
    1 | Dog | Leash |  1 
    2 | Dog | Crate |  0 
    3 | Cat | Leash |  1 
    4 | Cat | Box |  1 

私はオプションを指定した場合、それはそれが唯一の可能な選択肢であることをすべての名前を返す必要があることをクエリをしたいです。例えば、私がLeashを指定した場合、LeashはDogにとって唯一利用可能なオプションなので、Dogは返されます。このアイデアは、利用可能なオプションが存在しない場合に、現在利用可能なオプションがもうないユーザーに通知されます。これは、この基準に適合する任意の数の名前を返すはずですが、一度に1つのオプションしか指定されません(同じクエリに対してLeashとCrateを指定することはできません)。これは実行するための簡単なクエリのようだが、それは私に来ていない。

答えて

1

あなたはこのためにconditional aggregationを使用することができます。

select name 
from pets 
where optionAvail = 1 
group by name 
having count(case when `option` != 'Leash' then 1 end) = 0 
+0

私は条件付集計で多くの経験がありませんでしたので、あなたの答えに感謝しています。 – yanman1234

0

は、オプションの総数は、あなたが選択しているオプションを数えます。それらが同じであれば、これが唯一の選択肢です。

SELECT name 
FROM pets 
WHERE optionAvaile = 1 
GROUP BY name 
HAVING COUNT(*) = SUM(option = 'Leash') 
関連する問題