2

8列のMySQLテーブルがあり、それぞれがINT(1) default 0.

8 つのフィールドのうち 1 つだけが 1 に等しいかどうかをテストするにはどうすればよいですか?

4

2 に答える 2

2

これを試して:

where 1 = (field1 = 1) + (field2 = 1) + ...

1これは、MySQL の各条件がまたはに変換されることに基づいて機能します0。すべての条件の合計が である場合、それは 1 つだけが(または)1であることを意味します。1true

于 2012-04-10T02:54:54.393 に答える
0

これはうまくいきます:

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) になり、11 以上の場合 (設定されている場合) の値として追加されるためです。

デフォルトのセットがない場合は、クエリを次のようにさらに絞り込むことができます。

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;
于 2012-04-10T03:40:29.817 に答える