2015-04-09 4 views
0

У меня есть некоторые данные в таблице UniqueCrash, которая имеет значение хеша, и issue_id (это внешний идентификатор отслеживания ошибок).sql (ite) - группировка данных в одной таблице

Я хочу найти список строк UniqueCrash, где одно и то же значение хэша - поскольку это хэш стека вызовов - было назначено более чем одному идентификатору отслеживания ошибок (поскольку это означает, что дубликат ошибки был зарегистрирован).

Мой тест данных выглядит следующим образом (ID, хэш, ID Issue):


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 вращаются вокруг, и я не понимаю, почему.

Может ли кто-нибудь предложить лучший способ переписать этот запрос (и тот, который действительно работает)?

ответ

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

Смежные вопросы