У меня есть 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
Просмотр на скрипке: БД на скрипке