MySQL中两表UNION后如何获取指定Id对应的最低价格记录
跨表查询Id=123对应最低价格记录方案
之前写法的问题说明
- 第一次单表查询错误:子查询取的是全表最低价格,没有过滤
Id="123"条件,所以全表最低价格对应的Id不是123时就查不到结果 - 后续GROUP BY写法错误:按Name分组计算的是每个Name对应的最低价格,不是所有Id=123记录的全局最低价格,返回结果不符合需求
通用实现代码
所有主流数据库都兼容的子查询写法:
SELECT DISTINCT Name, Price FROM ( SELECT Name, Id, Price FROM A UNION SELECT Name, Id, Price FROM B ) AS combined_table WHERE Id = "123" AND Price = ( SELECT MIN(Price) FROM ( SELECT Name, Id, Price FROM A UNION SELECT Name, Id, Price FROM B ) AS combined_table WHERE Id = "123" );
如果使用支持CTE语法的数据库(MySQL 8.0+、PostgreSQL、SQL Server等),可以用更简洁的写法:
WITH combined_table AS ( SELECT Name, Id, Price FROM A UNION SELECT Name, Id, Price FROM B ) SELECT DISTINCT Name, Price FROM combined_table WHERE Id = "123" AND Price = (SELECT MIN(Price) FROM combined_table WHERE Id = "123");
补充说明
- 现有逻辑使用
UNION会自动去除两张表中完全重复的行,外层加DISTINCT是保证相同Name和Price的记录只返回一条,和你给出的预期结果一致 - 如果需要保留所有重复的最低价格记录,把
UNION改成UNION ALL,同时去掉外层的DISTINCT关键字即可
内容的提问来源于stack exchange,提问作者DataM
相关产品推荐
相关产品推荐

