MYSQL запрос на выявление распространенных ошибок в различных версиях - PullRequest
1 голос
/ 26 мая 2020

У меня есть данные об ошибке в разных версиях. Мне нужно найти общие ошибки, которые распространяются из старых выпусков. В приведенном ниже образце данных мне интересно узнать общие ошибки версии в этом примере: «Это старая ошибка 8.x», т.е. последние 3 строки в данных

9.1.1.5   |xymodel1 |227501| This is a 9.x new bug 
8.1.2.9   |xymodel1 |227501| This a 8.x new bug 
8.1.1.5   |xymodel1 |227501| This a 8.x new1 bug 
7.1.2.30  |xy6700   |287640| This is a 7.x new bug
7.1.2.30  |xy6700   |288185| This is a 7.x new1 bug
9.1.1.5   |xymodel1 |227501| This is a 9.x new bug 
10.1.2.30 |xy6700   |288368| This is a 10.x new bug 
10.1.1.6  |xymodel1 |227501| This is a 10.x new bug 
8.1.1.5   |xymodel1 |227501| This is a 8.x old bug
9.1.1.5   |xymodel1 |227501| This is a 8.x old bug
10.1.1.5  |xymodel1 |227501| This is a 8.x old bug

Я выполнил следующий запрос что должно было дать мне общую ошибку в 8.x, 9.x и 10.x, поскольку есть условие AND. Но в результатах я вижу также несколько других сопровождаемых строк, которые не являются общими для трех выпусков.

select * from issue_table
where
bug_name in (select bug_name from issue_table where version like '8.%' and '9.%' and '10.%')

Результаты: две верхние строки не должны были появляться в результатах, поскольку они не являются общими для разных выпусков .

version   model     data    bug_name
8.1.2.9   xymodel1  227501  This a 8.x new bug
8.1.1.5   xymodel1  227501  This a 8.x new1 bug
8.1.1.5   xymodel1  227501  This is a 8.x old bug
9.1.1.5   xymodel1  227501  This is a 8.x old bug
10.1.1.5  xymodel1  227501  This is a 8.x old bug

Я ожидал:

version   model     data    bug_name
8.1.1.5   xymodel1  227501  This is a 8.x old bug
9.1.1.5   xymodel1  227501  This is a 8.x old bug
10.1.1.5  xymodel1  227501  This is a 8.x old bug

SQL Ссылку на скрипт можно найти здесь: https://www.db-fiddle.com/# & togetherjs = VTGbSRMgIO

Ребята, не могли бы вы помочь мне отредактировать запрос, чтобы выбрать только общую ошибку во всех трех выпусках.

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Это может быть то, что вы ищете:

select * 
from issue_table
where bug_name in (
    select bug_name 
    from issue_table 
    where version like '8.%' 
    or version like '9.%' 
    or version like '10.%' 
    group by bug_name 
    having count(*) = 3)

Подвыбор подсчитывает ошибки, присутствующие во всех трех версиях.

Вы также можете записать это как соединение :

select it.* 
from (
    select bug_name 
    from issue_table 
    where version like '8.%' 
    or version like '9.%' 
    or version like '10.%' 
    group by bug_name 
    having count(*) = 3
) tmp, issue_table it 
where it.bug_name = tmp.bug_name
0 голосов
/ 26 мая 2020

Вы можете использовать условие exists для каждой возможной основной версии:

select i.*
from issue_table i
where
    exists(select 1 from issue_table i1 where i1.bug_name = i.bug_name and i1.version like '8.%')
    and exists(select 1 from issue_table i1 where i1.bug_name = i.bug_name and i1.version like '9.%')
    and exists(select 1 from issue_table i1 where i1.bug_name = i.bug_name and i1.version like '10.%')

Хотя это может показаться немного длинным, это должно быть эффективным вариантом при условии, что у вас есть индекс на (bug_name, version).

В вашем DB Fiddle это возвращает:

| version  | model    | data   | bug_name              |
| -------- | -------- | ------ | --------------------- |
| 8.1.1.5  | xymodel1 | 227501 | This is a 8.x old bug |
| 9.1.1.5  | xymodel1 | 227501 | This is a 8.x old bug |
| 10.1.1.5 | xymodel1 | 227501 | This is a 8.x old bug |
...