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 进行了两次比较(一次用于 CASE,一次用于 WHERE 子句)。我不知道这是多少开销。

这是一个 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 回答