Как найти последовательность из другой таблицы, запрос MYSQL? - PullRequest
1 голос
/ 10 апреля 2019

У меня есть 2 таблицы в базе данных MySQL.Это первый результат, а второй таблица testrun.Таблица результатов содержит данные тестов, а таблица testrun - какой тест необходимо протестировать.

Мне нужно знать, существует ли последовательность, которую вы можете найти в testrun, в результатах, а также результат не может быть 0 в этой последовательности.

**testrun**
    +---------+------------+----------+----------------+
    | BoardId | TestSpecId | sequence | ExecutionOrder |
    +---------+------------+----------+----------------+
    |    9000 |          1 |      400 |              1 |
    |    9000 |          1 |      401 |              2 |
    |    9000 |          2 |        4 |              1 |
    |    9000 |          2 |        2 |              2 |
    |    9000 |          2 |        3 |              3 |
    |    9000 |          2 |        1 |              4 |
    |    9001 |          1 |      401 |              1 |
    |    9001 |          1 |      403 |              2 |
    |    9001 |          1 |      404 |              3 |
    |    9001 |          2 |        5 |              1 |
    |    9001 |          2 |        2 |              2 |
    |    9001 |          2 |        3 |              3 |
    |    9001 |          2 |        1 |              4 |
    |    9001 |          2 |        4 |              5 |
    +---------+------------+----------+----------------+
**results**
+---------+--------+------------------+------------+----------+----------------+
| BoardId | Result | ProductionLinkId | TestSpecId | sequence | ExecutionOrder |
+---------+--------+------------------+------------+----------+----------------+
|    9000 |      1 |              200 |          1 |      400 |              1 |
|    9000 |      1 |              200 |          1 |      401 |              2 |
      Sequence Passed
|    9000 |      1 |              200 |          2 |        4 |              1 |
|    9000 |      1 |              200 |          2 |        2 |              2 |
|    9000 |      1 |              200 |          2 |        3 |              3 |
       Missing a value in sequence: sequence failed
|    9001 |      1 |              300 |          1 |      401 |              1 |
|    9001 |      1 |              300 |          1 |      403 |              2 |
|    9001 |      1 |              300 |          1 |      404 |              3 |
      Sequence passed
|    9001 |      1 |              300 |          2 |        5 |              1 |
|    9001 |      1 |              300 |          2 |        2 |              2 |
|    9001 |      1 |              300 |          2 |        3 |              3 |
|    9001 |  **0** |              300 |          2 |        1 |              4 |
|    9001 |      1 |              300 |          2 |        4 |              5 |
       Sequence contains 0: sequence failed
|    9001 |      1 |              400 |          1 |      401 |              1 |
|    9001 |      1 |              400 |          1 |      403 |              2 |
|    9001 |      1 |              400 |          1 |      404 |              3 |
      Sequence passed
|    9001 |      1 |              500 |          1 |      401 |              1 |
|    9001 |      1 |              500 |          1 |      403 |              2 |
|    9001 |      1 |              500 |          1 |      404 |              3 |
      Sequence passed
|    9001 |      1 |              500 |          2 |        5 |              1 |
|    9001 |      1 |              500 |          2 |        2 |              2 |
|    9001 |  **0** |              500 |          2 |        3 |              3 |
|    9001 |      1 |              500 |          2 |        5 |              1 |
|    9001 |      1 |              500 |          2 |        2 |              2 |
|    9001 |      1 |              500 |          2 |        3 |              3 |
|    9001 |      1 |              500 |          2 |        1 |              4 |
|    9001 |      1 |              500 |          2 |        4 |              5 |
      Sequence passed because sequence comes after each other and its all 1
+---------+--------+------------------+------------+----------+----------------+

Результаты, которые мынужно получить с SQL-запросом следующее

+---------+------------------+------------+---------+
| BoardId | ProductionLinkId | TestSpecId | Results |
+---------+------------------+------------+---------+
|    9000 |              200 |          1 |       1 |
|    9000 |              200 |          2 |       0 |
|    9001 |              300 |          1 |       1 |
|    9001 |              300 |          2 |       0 |
|    9001 |              400 |          1 |       1 |
|    9001 |              500 |          1 |       1 |
|    9001 |              500 |          2 |       1 |
+---------+------------------+------------+---------+
    

Таким образом, для каждого конкретного BoardId, конкретного ProductionLinkId и конкретного TestSpecId требуется результат.

SELECT * FROM testrun,results where 
testrun.BoardId = results.boardId 
and testrun.TestSpecId = results.TestSpecId 
and testrun.SequenceId = results.sequenceId 

Обновление с помощью fiddle: Скрипт БД

select * from (select * from results where result = 1) as res
    left outer join (SELECT * FROM testrun) as run on res.BoardId = run.boardId and res.TestSpecId = run.TestSpecId and res.SequenceId = run.sequenceId
union
select * from (select * from results where result = 1) as res
    right outer join (SELECT * FROM testrun) as run on res.BoardId = run.boardId and res.TestSpecId = run.TestSpecId and res.SequenceId = run.sequenceId 
order by ProductionLinkId

Вид на скрипку: Скрипка БД
Здесь вы получитекакое значение отсутствует, но вы не знаете, из какого оно получено ProductionLinkId и существует ли правильная последовательность со всем тестом, необходимым для запуска.

Это пример файла с дополнительными данными: Пример файла SQL


После долгих поисков я наконец нашел его.

SELECT res.BoardId, res.ProductionLinkId, res.TestSpecId, res.execu, spec.exec, if(res.execu LIKE CONCAT('%',spec.exec,'%'),1,0) FROM
    (SELECT BoardId, TestSpecId, group_concat(ExecutionOrder order by ExecutionOrder) as exec FROM testrun group by BoardId, TestSpecId) as spec
inner join
    (SELECT BoardId, ProductionLinkId, TestSpecId, group_concat(ExecutionOrder order by resultId) as execu FROM (SELECT * FROM results where result = 1) as resultGrpSpec group by BoardId, ProductionLinkId, TestSpecId) as res
on spec.BoardId = res.BoardId and spec.TestSpecId = res.TestSpecId

Просмотр на скрипке: БД на скрипке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...