我在MySQL 5.7.35中作業,我有以下表格:
我在MySQL 5.7.35中作業。
create table Table1 (
Id int not null auto_increment,
名稱 varchar(255) not null,
primary key(Id)
);
創建 表 Table2 (
Id int not null auto_increment,
Name varchar(255) not null,
Table1_Id int not null,
primary key(Id)。
foreign key(Table1_Id) references Table1(Id)
);
創建 表 Table3 (
Id int not null auto_increment,
型別 varchar(255) not null。
名稱 varchar(255) not null。
Result varchar(255) not null,
Table2_Id int not null,
primary key(Id)。
foreign key(Table2_Id) references Table2(Id)
);
在內部,我有以下的資料:
| Id | Name |
| -- | ---------- |
| 1 | 計算機A |
---
| Id | Name | Table1_Id |
| -- | ---------- | --------- |
| 1 | 測驗運行1 | 1 |
-----
| Id | 型別 | 名稱 | Result | Table2_Id |
| -- | --------- | ------- | --------- |
| 1 | 處理器 | MMX | Pass | 1 |
| 2 | 處理器| SSE | Pass | 1 |
| 3 | 處理器| SSE 2 | Pass | 1 |
| 4 | 顯示| 紅色 | 通過 | 1 | 通過
| 5 | 顯示| 綠色 | 通過 | 1 | 通過
| 6 | 鍵盤| 一般 | 通行證 | 1 |
| 7 | 鍵盤|燈光 | 跳過 | 1 |
| 8 | 網路 | | 以太網 | 通 | 1 |
| 9 | 網路 | | 無線 | 跳過 | 1 |
| 10 | 網路 | |藍牙 |失敗 | 1 |
期望的查詢
我想要兩列table1_name和test_result,其中test_result是一個串聯的字串,其邏輯如下:
對于Type中的任何給定值:
- 如果全部通過,那么結果是
Pass。
- 如果任何一個是失敗的,那么結果是
Fail。
- 如果有任何跳過(假定前兩點被檢查),那么結果是
跳過。
因此,對于當前的資料,輸出結果將是:
。| table1_name | test_result |
| ----------- | ---------------------------------------------------------------- |
| 計算機A | 處理器。通過, 顯示屏: 通過, 鍵盤。跳過,網路。失敗 |
當前查詢
當我希望凝聚的專案在兩級的子表中時,我正在努力進行分煤作業。我當前的查詢是:
select t1.Name as 'table1_name'>--凝聚在這里發生。
from Table1 t1
inner join Table2 t2 on t1.Id = t2.Table1_Id
inner join Table3 t3 on t2.Id = t3.Table2_Id。
我創建了一個db-fiddle以使事情變得更容易。
uj5u.com熱心網友回復:
這看起來像兩級聚合:
select Name, group_concat(name, ' : ', result separator ' , ')
from (select t1.Name, t3.type,
(case when min(result) = max(result) then min(result)
else 'Skipped'/span>
end) as result
from Table1 t1 inner join
表2 t2
on t1.Id = t2.Table1_Id inner join
表3 t3
on t2.Id = t3.Table2_Id
group by t1.Name, t3.type
) nt
group by Name;
uj5u.com熱心網友回復:
使用GROUP_CONCAT()來收集每個Name和Type組合的所有Result,以你喜歡的順序,然后在另一個層次的聚合中挑選第一個1:
SELECT table1_name,
GROUP_CONCAT(Type, ': ', SUBSTRING_INDEX(Results, ', ', 1) SEPARATOR ', ') test_result
FROM (
SELECT t1.Name table1_name, t3.Type,
GROUP_CONCAT(Result ORDER BY Result = ' Fail' DESC, Result = 'Skipped' DESC) 結果
FROM Table1 t1
INNER JOIN Table2 t2 on t1.Id = t2.Table1_Id
INNER JOIN Table3 t3 on t2.Id= t3.Table2_Id
GROUP BY t1.Name, t3.Type
) t
GROUP BY table1_name;
如果你想保留結果中Type的順序:
SELECT table1_name,
GROUP_CONCAT(Type, ': ', SUBSTRING_INDEX(Results, ', ', 1) ORDER BY Id SEPARATOR ', ') test_result
FROM (
SELECT t1.Name table1_name, MIN(t3.Id)Id, t3.Type,
GROUP_CONCAT(Result ORDER BY Result = ' Fail' DESC, Result = 'Skipped' DESC) 結果
FROM Table1 t1
INNER JOIN Table2 t2 on t1.Id = t2.Table1_Id
INNER JOIN Table3 t3 on t2.Id= t3.Table2_Id
GROUP BY t1.Name, t3.Type
) t
GROUP BY table1_name;
請看demo.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/321941.html
標籤:
