8列のMySQLテーブルがあり、それぞれがINT(1) default 0
.
8 つのフィールドのうち 1 つだけが 1 に等しいかどうかをテストするにはどうすればよいですか?
これを試して:
where 1 = (field1 = 1) + (field2 = 1) + ...
1
これは、MySQL の各条件がまたはに変換されることに基づいて機能します0
。すべての条件の合計が である場合、それは 1 つだけが(または)1
であることを意味します。1
true
これはうまくいきます:
SELECT field1 + field2 + field3 + field4 + field5 + field6 + field7 + field8 = 1
AS ONLY_ONE
合計が 1 の場合は (TRUE)を返し1
、1 より大きい (複数のセット) または 1 より小さい (セットがない) 場合は 0 (FALSE) を返します。
テーブル/データベースが厳密モードでない場合 (0 と 1 以外の値が可能になるため)、次のことができます。
SELECT (field1 > 0) + (field2 > 0) + (field3 > 0) ... = 1 AS ONLY_ONE
式が真 (1) になり、1
1 以上の場合 (設定されている場合) の値として追加されるためです。
デフォルトのセットがない場合は、クエリを次のようにさらに絞り込むことができます。
SELECT COALESCE(field1 > 0, 0) + COALESCE(field2 > 0, 0) + COALESCE(field3 > 0, 0) ...
= 1 AS ONLY_ONE
したがって、ベースをカバーする最良の方法は次のとおりです。
SELECT
COALESCE(field1 > 0, 0) +
COALESCE(field2 > 0, 0) +
COALESCE(field3 > 0, 0) +
COALESCE(field4 > 0, 0) +
COALESCE(field5 > 0, 0) +
COALESCE(field6 > 0, 0) +
COALESCE(field7 > 0, 0) +
COALESCE(field8 > 0, 0) +
= 1 AS ONLY_ONE
FROM my_table;