[英]Multiple select from one row from A table and insert result as multiple rows in B table and repeat in one query
[英]MySQL - select multiple rows from one table into one result row
我有一張表,其中定期導入值。 對於統計用途,我需要創建兩個日期的差異視圖。
表看起來像
名稱 | cpu_count | 記憶計數 | 導入日期 |
---|---|---|---|
α | 2個 | 4個 | 2022-09-28 |
α | 2個 | 6個 | 2022-10-01 |
我需要 select 列,如名稱、cpu_old、memory_old、cpu_new、memory_new排成一行。
名稱 | cpu_old | 內存舊 | cpu_new | 內存_新 |
---|---|---|---|---|
α | 2個 | 4個 | 2個 | 6個 |
有誰能夠幫我? 我正在嘗試使用 UNION、GROUP 等,但每次我得到兩行。
解決方案 1
你有這樣的數據:
SQL 用於創建表:
CREATE TABLE `my_cpu` (
`name` varchar(32) NOT NULL,
`cpu_count` tinyint(4) DEFAULT NULL,
`memory_count` tinyint(4) DEFAULT NULL,
`import_date` date NOT NULL,
PRIMARY KEY (`name`,`import_date`)
) ENGINE=MyISAM DEFAULT CHARSET=ascii
結果:
SQL 用於創建該結果:
SELECT a.name,
a.cpu_count AS cpu_old,
a.memory_count AS memory_old,
b.cpu_count AS cpu_new ,
b.memory_count AS memory_new
FROM `my_cpu` a INNER JOIN `my_cpu` b ON a.name = b.name
WHERE a.import_date = "2022-09-28" AND b.import_date = "2022-10-01"
解釋:
進一步閱讀:
https://www.w3schools.com/sql/sql_join_self.asp
替代解決方案:
這適用於隨機/不同的導入日期
對不同的導入日期使用 group_concat 和 substring_index。
結果:
SQL:
SELECT `name`,
SUBSTRING_INDEX(SUBSTRING_INDEX(cpu_count,",",2),",",-1) cpu_old,
SUBSTRING_INDEX(SUBSTRING_INDEX(memory_count,",",2),",",-1) memory_old,
SUBSTRING_INDEX(cpu_count,",",1) cpu_new,
SUBSTRING_INDEX(memory_count,",",1) memory_new
FROM
(
SELECT `name`,
GROUP_CONCAT(`cpu_count` ORDER BY `import_date` DESC) cpu_count,
GROUP_CONCAT(`memory_count` ORDER BY `import_date` DESC) memory_count
FROM `my_cpu`
GROUP
BY NAME
)
AS dbx
解釋:
為 get cpu 和 memory 創建查詢,按 import_date 降序排列每個 cpu_name
查詢:
SELECT `name`,
GROUP_CONCAT(`cpu_count` ORDER BY `import_date` DESC) cpu_count,
GROUP_CONCAT(`memory_count` ORDER BY `import_date` DESC) memory_count
FROM `my_cpu`
GROUP
BY NAME
會重現:
使用 substring_index 搜索,
最后一個字母是 (,) 之前的第一個字母
第二個(最舊的)將是 (,) 之后的第二個字母
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.