2012-10-10 55 views
0

我正试图在表中找到重复项。需要检查重复的字段是来自PHP的序列化数组。这是我的查询:是否有可能找出哪个字段在表mysql匹配?

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

什么,我想从这个查询是选择所有那些不是我试着去配合他们序列化数组包含状态的状态:blob1或序列化数组包含:blob2 。

这个工作,它返回重复只是罚款,但我需要知道它匹配哪一个,它是匹配blob1或匹配blob2。是否有可能直接从查询而不使用PHP?

换句话说,是否有可能找出哪个字段匹配找到重复。

回答

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

下面是一个例子SQLFiddle(虽然没有使用斑点或变量):http://sqlfiddle.com/#!2/3fc41/6

+0

给了我语法错误 – Giorgi

+0

并且错误消息是? (我的意思是daft之后的部分“你有错误”信息) –

+0

所以*我的*声明是正确的,但是你的改变产生了错误? –

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子句中,您正在使用小结果集)

+0

这将返回匹配的BLOB1如果blob1匹配? – Giorgi

+0

这将按照您描述的方式添加2列(但对于这两个blob)。一个用于BLOB1,一个用于BLOB2。你可以把它放在一列中(只要将BLOB2复制到第一个if的一部分),但这会让你知道两个blob是否匹配。 –

相关问题