![](/img/trans.png)
[英]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.