繁体   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