:あなたは、レーベンシュタインPHP関数を使用することができます。
あなたは次のよう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
そして点検記録とデータベースの間Hamming distanceを計算するが、これが唯一の条件の複雑さを減少させますが、トラフすべてのレコードを反復処理する必要があります。同じままです。使用MySQLで
実装:これは単なる完全正規化スキーマで
SELECT (
$MAX_NUMBER$ - BIT_COUNT(XOR(`binary_representation`, $DATA_FROM_USER$))
) AS `matches_cnt`
ユーザー入力とデータを同じ昇順に並べて比較するのが最善の方法です。 –