我在名为UniqueCrash的表中有一些数据,它有一个哈希值,还有一个issue_id(它是一个外部错误跟踪器ID)。
我想要找到的是一个UniqueCrash行列表,其中相同的散列值 - 因为它是调用堆栈的散列 - 已被分配给多个错误跟踪器ID(因为这意味着重复的错误已被删除)记录)。
我的测试数据如下所示(ID,哈希,问题ID):
1 | 12345 | Bug 1
2 | 12345 | Bug 2
3 | 12345 | Bug 3
4 | 123456 | Bug 4
我希望我的结果看起来像这样:
1 | 12345 | Bug 1
2 | 12345 | Bug 2
3 | 12345 | Bug 3
(即只删除最后一个条目 - 该哈希仅使用一次)
我真的不知道这种技术的名称是什么,如果确实有它的名字。到目前为止,我有一个查询似乎能够提供几乎正确的数据:
SELECT UniqueCrash.id, hash, issue_id
FROM UniqueCrash
WHERE hash IN
( SELECT hash FROM
( SELECT UniqueCrash.id, hash, issue_id
FROM UniqueCrash WHERE
UniqueCrash.issue_id IS NOT NULL
GROUP BY hash, issue_id )
GROUP BY hash HAVING COUNT(issue_id) > 1 )
ORDER BY hash ASC, id ASC
但是当它返回3个正确(按ID)行时,看起来第1行与第2行的问题ID是错误的,我看不出原因。
有人能建议一种更好的方法来重写这个查询(以及一个实际可行的查询)吗?
答案 0 :(得分:1)
只需使用COUNT DISTINCT
即可:
SELECT `id`, `hash`, `issue_id`
FROM UniqueCrash
WHERE `hash` IN (
SELECT `hash` from UniqueCrash
GROUP BY `hash`
HAVING COUNT(DISTINCT `issue_id`) > 1)
ORDER BY `hash` ASC, `id` ASC
请参阅DEMO HERE