mysql union找回错误1022-我该如何解决?

问题描述

我的天气计划有两个不同的表,降雨量和外部温度。

我试试这个:

SELECT 
 savetime,UNIX_TIMESTAMP(savetime) as unixt,(MAX(counteramount) - MIN(counteramount))*295/1000 as rainc 
 from rainfall 
 union 
 Select 
 savetime,avg(weatherdata)as temp 
 FROM outside_temp 
 where savetime >= DATE_SUB(CURDATE(),INTERVAL 90 DAY) 
 group by day(savetime)

但返回失败: #1222-使用的SELECT命令返回不同数量的字段

我没有计划如何解决此问题...

最好的问候 基多

解决方法

UNION的列数必须相同,因此在unixtome列中添加simpo就可以了

querydsl-mongodb
SELECT 
    savetime,UNIX_TIMESTAMP(savetime) AS unixt,(MAX(counteramount) - MIN(counteramount)) * 295 / 1000 AS rainc,''
FROM
    rainfall 
UNION SELECT 
    savetime,''
    AVG(weatherdata) AS temp
FROM
    outside_temp
WHERE
    savetime >= DATE_SUB(CURDATE(),INTERVAL 90 DAY)
GROUP BY DAY(savetime)
CREATE TABLE outside_temp (
  `savetime` DATETIME,`weatherdata` FLOAT,`newflag` INTEGER
);

INSERT INTO outside_temp
  (`savetime`,`weatherdata`,`newflag`)
VALUES
  ('2020-01-31 01:10:00','8.9','1'),('2020-01-31 03:25:00',('2020-01-31 05:40:00','9.1',('2020-01-31 00:10:00','8.8',('2020-01-31 04:25:00','9.3',('2020-01-31 00:55:00','9',('2020-01-31 01:25:00',('2020-01-31 00:25:00',('2020-01-31 04:10:00','1');
CREATE TABLE rainfall (
  `savetime` VARCHAR(34),`raincounter` INTEGER,`counteramount` INTEGER,`israining` INTEGER,`newflag` INTEGER
);

INSERT INTO rainfall
  (`savetime`,`raincounter`,`counteramount`,`israining`,`newflag`)
VALUES
  ('2020-01-31 09:10:00','2016','37290','0',('2020-01-31 16:56:00',('2020-01-31 07:40:00',('2020-01-31 05:10:00',('2020-01-31 11:11:00',('2020-01-31 15:11:00',('2020-01-31 20:56:00',('2020-01-31 11:41:00',('2020-01-31 08:55:00',('2020-01-31 15:41:00',('2020-01-31 12:11:00','1');
savetime_temp       |          AVG_temp |  rainc
:------------------ | ----------------: | -----:
2020-01-31 00:10:00 | 9.011111047532824 | 0.0000

db 提琴here

,

您需要相同数量的列和匹配的数据类型..如果没有足够的列,则添加空列

 SELECT 
    day(savetime),UNIX_TIMESTAMP(savetime) as unixt,(MAX(counteramount) - MIN(counteramount))*295/1000 as rainc,null  temp
    from rainfall 
    group by day(savetime)
 union 
 Select 
    day(savetime),null,avg(weatherdata) 
 FROM outside_temp 
 where savetime >= DATE_SUB(CURDATE(),INTERVAL 90 DAY) 
 group by day(savetime)