残念ながら、このような問題に対して効率的にクエリを作成することはできません。
WHERE
次のような句を作成できます。
(`1` IN ARRAY(1,2,3,4,5,6,7)
AND `2` IN ARRAY(1,2,3,4,5,6,7)
AND `3` IN ARRAY(1,2,3,4,5,6,7)
AND `4` IN ARRAY(1,2,3,4,5,6,7)
AND `5` IN ARRAY(1,2,3,4,5,6,7))
OR
(`1` IN ARRAY(1,2,3,4,5,6,7)
AND `2` IN ARRAY(1,2,3,4,5,6,7)
AND `3` IN ARRAY(1,2,3,4,5,6,7)
AND `4` IN ARRAY(1,2,3,4,5,6,7)
AND `6` IN ARRAY(1,2,3,4,5,6,7))
-- Each combination
しかし、それはとんでもない条件だろう。一方、次の組み合わせを使用してみてください。
まず、列1
に情報が含まれているかどうかを確認します。
IF( `1` IN ARRAY(1,2,3,4,5,6,7), 1, 0)
次に、これらすべてのデータを合計します。
SELECT (
IF( `1` IN ARRAY(1,2,3,4,5,6,7), 1, 0) +
IF( `2` IN ARRAY(1,2,3,4,5,6,7), 1, 0) +
IF( `3` IN ARRAY(1,2,3,4,5,6,7), 1, 0) +
IF( `4` IN ARRAY(1,2,3,4,5,6,7), 1, 0) +
IF( `5` IN ARRAY(1,2,3,4,5,6,7), 1, 0) +
IF( `6` IN ARRAY(1,2,3,4,5,6,7), 1, 0) +
IF( `7` IN ARRAY(1,2,3,4,5,6,7), 1, 0)
) AS `matches_cnt`
FROM t1
HAVING `matches_cnt` >= 5
これはすべての行を反復し、条件は非常に複雑です (したがって、ベッドのパフォーマンス)。
値をバイナリ文字列に置き換えてみることもできます。次に例を示します。
1,2,7 = 01000011
次に、チェックされたレコードとデータベースの間のハミング距離を計算しますが、これは条件の複雑さを減らすだけですが、すべてのレコードが同じままになるように反復する必要があります。
以下を使用した mysql での実装:
最初の部分を次のように置き換えます。
SELECT (
$MAX_NUMBER$ - BIT_COUNT( XOR( `binary_representation`, $DATA_FROM_USER$))
) AS `matches_cnt`