2011-12-07 15 views
0

ベンダーに関する情報を格納するテーブルがあります。そこには、ベンダーがどの部門に属しているかを示す約10のブール型列があります。ベンダーは複数の部門に所属することができます。MySQLで少なくとも2つ以上のブール値の列がtrueの場合の戻りレコード

真になっているブール型列が複数あるベンダーを見つけるためにテーブルをクエリするにはどうすればよいですか?

マイtbl_vendor_departments列:

vendor_id(varchar型)vendor_name(varchar型)clothing(ブール値)automotive(ブール値)lawn_garden(ブール値)tools(ブール値)...というように。

答えて

1

私はブーリアンが実際には小さなint(0または1)として扱われると思います。その場合、あなたはすべてのブールフィールドを追加し、結果のMySQLには> 1.

.... 
WHERE 
    clothing + automotive + lawn_garden + .... + tools > 1 
4

をかどうかを確認することができ、ブールは、あなたはその後、算術演算を使用することができるだけで、整数0または1である:

SELECT ... 
FROM tbl_vendor_departments 
WHERE (clothing + automotive + lawn_garden + tools) >= 2 

厳密に言えば、MySQLではゼロが偽であり、ゼロ以外の値がすべてtrueです。したがって、「ブール値」列に1より大きな値(たとえば42)が含まれていると、予期しない結果になる可能性があります。これを補うためには、真の値を偽に反転してから再び反転させることができます。これにより、42が0に変換され、1に戻ります。オペレータの優先順位を制御するには、かっこを使用します。

SELECT ... 
FROM tbl_vendor_departments 
WHERE (
    (NOT NOT clothing) + 
    (NOT NOT automotive) + 
    (NOT NOT lawn_garden) + 
    (NOT NOT tools) 
) >= 2 

他のSQL実装では試してはいけません。ほとんどの場合、整数演算と互換性のある形でbooleanが実装されていないため、上記のクエリはANSI SQLによってエラーを生成します。人のために、あなたは真の1に変換するために、CASE式を使用できます。それは保証機能である場合

SELECT ... 
FROM tbl_vendor_departments 
WHERE (
    CASE clothing WHEN true THEN 1 ELSE 0 END + 
    CASE automotive WHEN true THEN 1 ELSE 0 END + 
    CASE lawn_garden WHEN true THEN 1 ELSE 0 END + 
    CASE tools  WHEN true THEN 1 ELSE 0 END 
) >= 2 
+0

優れた回答と優れた情報もあります。私は答えとしてチェックするだろうが、Golez Trolが最初にそれを取得し、それは動作した...確かに+1。 – Ofeargall

+0

ねえ、私は@GolezTrolが投稿したときに答えを入力していました。彼/彼女はより早いことを信じています! :) –

+0

ああ!私は二重の 'NOT'ステートメントを考えなかったでしょう。構造化されたクエリの魔法の素敵なビットがそこにあります。 – Ofeargall

0

私は知りません(それがあると思われる)が、私の経験では、真の意志に設定ブールフィールド、常に1になり、falseの場合には0になります。だから、すべてのフィールドを追加し、合計が2以上のレコードを選択するだけで、その仕事ができます。

関連する問題