2011-12-14 26 views
2

は、私が持っているようなクエリ:少なくとも2つの一致するフィールド(MySQLの)

SELECT * FROM table WHERE id=1 AND (field1=1 OR field2=1 OR field3=1 OR field4=1 OR field5=1 OR field6=1 OR field7=1 OR field8=1) 

実際のクエリが長く、カッコ内の25個の以上のフィールドがある...

方法少なくとも2つのフィールド= 1であることを確認しますか?それらが列であれば簡単ですが、列はどうですか?それが可能であるかどうかはわかりません。

基本的には、少なくとも2つの一致するフィールドがある場合にのみphp関数を実行する必要があります。次に、選択したフィールドが次回に選択されないように更新されます。

+1

これは本当に悪い考えですが、技術的に実行可能です: '(field1 = 1 AND field2 = 1)OR(field1 = 1 AND field3 = 1)OR ...'。入力する300の組み合わせのみ(25は2を選択)。 –

+0

はバイナリフィールドですか? (「0」または「1」のいずれか)。そうでない場合は、どのような種類のデータを保持していますか? –

+0

私は、これを決定するために何らかの種類の数式を列にわたって使用することが可能であるかもしれないので、尋ねます。 –

答えて

4

MySQLでは、条件文を直接評価することができ、真の場合は「1」を返し、偽の場合は「0」を返します。したがって、この場合には、あなただけそうのような条件文を合計することができます

SELECT * FROM table WHERE id=1 AND (field1=1) + (field2=1) + (field3=1) + (...) >= 2 

合計が2以上であれば、少なくとも2つのフィールドが値「1」を持っています。個別に評価されるように、ここで条件の前後にかっこを入れる必要があります。それ以外の場合は正しく解析されません。

一般的に、MySQLのIF機能もあります。これは次のように使用できます:

SELECT * FROM table WHERE id=1 AND IF(field1=1, 1, 0) + IF(field2=1, 1, 0) + IF(field3=1, 1, 0) + (...) >= 2 

IF()は3つの引数をとります。最初の状態です。条件が真であれば2番目の戻り値が返されます。 3番目は、条件がfalseの場合の戻り値です。これはMySQ1ではベア条件の値がIF(conditional, 1, 0)の値と等価であるため、これも機能します。

+0

mysqlの型キャストの規則を利用すると、これを単純化することができます: '...(field1 = 1)+(field2 = 1)+(field3 = 1)...'など。自動的にint 0/1にキャストされ、次に加算されます。 –

+0

@ MarcB、私の答えは2部構成で、すでに2部目と全く同じです。それをもっと明確にするために、私はちょうど再編成し、第2の部分を最初に入れました。 –

+0

優秀、私はこの方法を知らなかった。ありがとうございました。どちらも。新しい何か新しい毎日を学ぶ:) – domino

0

fields1..8を一緒に追加して、結果が2より大きい場合は、トリックを実行する必要があります。

+0

必ずしもそうではありません。 –

+0

これは私の考えでもありましたが、フィールドには何も含めることができることが分かりました。 –

+0

この場合、クエリにはfield1 = "1"のような文字列区切り文字が含まれています。 – Lars

3

おそらく、別の列または別のテーブルを、1の値を含むフィールドのカウントを含むリレーションシップによって追加することができます。明らかに、INSERT/UPDATEロジックがなければなりません。これは、既存のテーブルの更新時にこれを行うか、トランザクションで実行されます。BEGIN UPDATE ...;テーブルからのSELECT WHERE id = 1およびfields_containing_one> 2; COMMIT(あなたのUPDATEロジックとあなたの望むクエリとの間の競争の更新や挿入を確実にするため)

fieldNの値は0と1以外の数字であると暗黙のうちに仮定しています。フィールドNの値が0または1だけであることが分かっている場合は、おそらくフィールドNのすべての値のSUMで作業することができます。

テーブル/スキーマが非正規化されているようですデータセットの各行に対してfield1、field2、...を使用するのではなく、おそらく2つの列(field_numまたはattribute_nameおよび対応する値)を持つことによってスキーマを標準化することができます。次に、agのN個のフィールドを持つ1つの行の代わりに与えられたエンティティは、各エンティティごとにN個の行を持ちます。各(KEY)+(fieldN、value)タプルごとに1つです。

このスキーマでは、(各エンティティに "field_name"の各タイプの行が1つしかないようにするために、既存のキーが+ field_nameであれば)UNIQUEという制約を追加することができます。

あなたのスキーマであれば、次のようなことができます:SELECT id FROM(SELECT table WHERE id = 1 AND value = 1)WHERE COUNT(id)> 1(つまり、クエリ。

+0

(最初の2つの新しいフィールドを更新しました。 –

+0

+1 "全体的にはあなたのテーブル/スキーマが非正規化されているように聞こえますが、このデータベースで作業を続けると他の問題が発生する可能性があります" –

+1

(私の答えは質問に対する実際の答えがより良いとは思うが) –

関連する問題