簡體   English   中英

MySQL - select 一張表的多行到一個結果行

[英]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"

解釋:

  • 因為您每周存儲數據,所以您有 2 個日期。
  • 數據保存在一個 table_names 中,可以說是“my_cpu”。
  • 從 my_cpu 創建自連接。 所以你有 2 個表(a 和 b)。 條件 a.name = b.name
  • 過濾 a.import_date = your_old_date 和 b.import_date = your_new_date

進一步閱讀:

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

會重現:

解釋 1

使用 substring_index 搜索,

最后一個字母是 (,) 之前的第一個字母

第二個(最舊的)將是 (,) 之后的第二個字母

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM