0

テーブル内の重複を見つけようとしています。重複に対してチェックする必要があるフィールドは、PHPのシリアル化された配列です。これは私の質問です:

SELECT Blob, BID, ID
FROM  `Statuses`
WHERE ID <> :id AND (Blob LIKE :blob1 OR Blob LIKE :blob2)

このクエリから必要なのは、照合しようとしているステータスではなく、シリアル化された配列に:blob1が含まれている、またはシリアル化された配列に:blob2が含まれているステータスをすべて選択することです。

これは機能し、複製は問題なく返されますが、blob1と一致したかblob2と一致したか、どちらが一致したかを知る必要があります。PHPを使用せずにQueryから直接これを行うことは可能ですか?

言い換えれば、重複を見つけるために一致したフィールドを見つけることは可能ですか?

4

2 に答える 2

2

これは機能するはずです:

SELECT Blob, 
       BID, 
       ID,
       case 
          when blob like :blob1 then 0 
          when blob like :blob2 then 1
          else -1 
       end as matching_blob
FROM  Statuses
WHERE ID <> :id 
AND (Blob LIKE :blob1 OR Blob LIKE :blob2)

これは、blobが2回比較されることを意味します(CASEに対して1回、WHERE句に対して1回)。それがどれくらいのオーバーヘッドかわかりません。

SQLFiddleの例を次に示します(ただし、blobまたは変数は使用していません):http ://sqlfiddle.com/#!2 / 3fc41 / 6

于 2012-10-10T21:10:59.183 に答える
1
SELECT Blob, BID, ID, IF(Blob LIKE :blob1, 'Matched BLOB1', ''), IF(Blob LIKE :blob2, 'Matched BLOB2', '')
FROM  `Statuses`
WHERE ID <> :id AND (Blob LIKE :blob1 OR Blob LIKE :blob2);

パフォーマンスについて心配する必要はありません。オプティマイザーがこれを処理する必要があります。(そしてselect句では、小さな結果セットでそれを行っています)

于 2012-10-10T21:11:56.327 に答える