我正在尝试在表格中找到重复项。需要针对重复检查的字段是PHP的序列化数组。这是我的问题:
SELECT Blob, BID, ID
FROM `Statuses`
WHERE ID <> :id AND (Blob LIKE :blob1 OR Blob LIKE :blob2)
现在我想从这个查询中选择所有那些不是我想要匹配的状态并且它们的序列化数组包含的状态:blob1或序列化数组包含:blob2。
这很有效,它返回的副本就好了,但我需要知道它匹配哪一个,是否匹配blob1或匹配blob2。是否可以直接从Query中执行此操作而不使用PHP?
换句话说,是否有可能找出匹配的字段以找到副本。
答案 0 :(得分: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
答案 1 :(得分: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子句中,你是在小结果集上进行的)