我在下面的兩個表(資訊和檔案)之間有一個連接。
我想要的是連接看起來像下面的第三個表格布局。
對于 info 表中的每條記錄,我知道 files 表中會有兩行具有相同的 info_id。
我不確定我是否需要 mysql 版本的資料透視表或其他東西。我仍在尋找如何實作這一目標,但我也在尋求幫助。任何為我指明正確方向的幫助將不勝感激。
info table
id name
1 Peter
2 Jane
files table
id info_id filename
1 1 peter_file_1
2 1 peter_file_2
3 2 jane_file_1
4 2 jane_file_2
what I want is:
id name file1 file2
1 Peter peter_file_1 peter_file_2
2 Jane jane_file_1 jane_file_2
謝謝!彼得噸
uj5u.com熱心網友回復:
因為您知道您將始終擁有 2 個檔案,您可以通過為每個檔案使用相關子查詢來簡化傳統的資料透視:
select i.Id, i.Name,
(select filename from files f where f.info_id=i.id order by f.id limit 1) file1,
(select filename from files f where f.info_id=i.id order by f.id desc limit 1) file2
from info i
請參閱示例小提琴
uj5u.com熱心網友回復:
如果您的 MySql 版本是 8.0 ,您可以使用ROW_NUMBER()視窗函式對每個檔案名進行排名info_id,然后使用條件聚合:
SELECT i.id, i.name,
MAX(CASE WHEN f.rn = 1 THEN f.filename END) file1,
MAX(CASE WHEN f.rn = 2 THEN f.filename END) file2
FROM info i INNER JOIN (
SELECT *, ROW_NUMBER() OVER (PARTITION BY info_id ORDER BY id) rn
FROM files
) f ON i.id = f.info_id
GROUP BY i.id, i.name;
對于以前的版本,使用GROUP_CONCAT()and SUBSTRING_INDEX():
SELECT i.id, i.name,
SUBSTRING_INDEX(GROUP_CONCAT(f.filename ORDER BY f.id), ',', 1) file1,
SUBSTRING_INDEX(GROUP_CONCAT(f.filename ORDER BY f.id), ',', -1) file2
FROM info i INNER JOIN files f
ON i.id = f.info_id
GROUP BY i.id, i.name;
或者,如果存在特定檔案只有 1 個的情況info_id:
SELECT i.id, i.name,
SUBSTRING_INDEX(GROUP_CONCAT(f.filename ORDER BY f.id), ',', 1) file1,
CASE WHEN COUNT(*) > 1 THEN SUBSTRING_INDEX(GROUP_CONCAT(f.filename ORDER BY f.id), ',', -1) END file2
FROM info i INNER JOIN files f
ON i.id = f.info_id
GROUP BY i.id, i.name;
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/407035.html
標籤:
上一篇:SQL查詢JOIN和聚合
