UNION仅返回第一个SELECT结果的问题排查
问题分析与解决方法
你的SQL语句只返回Temperaturetab的数据,核心问题出在UNION的使用逻辑上:
- UNION的列匹配规则:
UNION要求两个查询的列数完全一致,且对应位置的列数据类型兼容,最终结果的列名由第一个查询的别名决定。你第二个查询的Timestamp会被映射到第一个查询的Time列,Humidity会被映射到Temp列——这完全不符合你的预期,甚至可能因数据类型不兼容导致第二部分数据被过滤。 - UNION的去重特性:默认的
UNION会自动去重合并相同的行,如果两个表的时间戳和对应值恰好有重复,会导致Humiditytab的数据丢失,应该用UNION ALL保留所有原始行。
正确的SQL写法
要实现「分别获取温度和湿度数据,后续在PHP中处理」的需求,需要让两个查询返回相同的列结构,缺失的列用NULL填充:
SELECT Timestamp as 'Time', Temperature as 'Temp', NULL as 'Hum' FROM Temperaturetab WHERE Timestamp BETWEEN '[some timestamp]' AND '[some other timestamp]' UNION ALL SELECT Timestamp as 'Time', NULL as 'Temp', Humidity as 'Hum' FROM Humiditytab WHERE Timestamp BETWEEN '[some timestamp]' AND '[some other timestamp]' ORDER BY Time; -- 可选,按时间戳排序,方便后续处理
这样查询结果会包含三列:
Time:所有来自两张表的时间戳Temp:温度值(仅Temperaturetab的行有值,其余为NULL)Hum:湿度值(仅Humiditytab的行有值,其余为NULL)
你在PHP中可以直接根据Temp和Hum是否为NULL来区分是温度数据还是湿度数据,无需额外处理时间戳。
内容的提问来源于stack exchange,提问作者Fabio Stefanelli
相关产品推荐
相关产品推荐

