group-by - mysql执行group的时候如何选择返回指定要求的列?
高洛峰
高洛峰 2017-04-17 13:00:40
[MySQL讨论组]

表A有字段idtitle,表B有a_idnameprice,A和B的关系为一对多

SQL如下:

select A.title,B.name,min(B.price) from A inner join B ON A.id=B.a_id group by B.a_id order by B.price

需求如下:我要在分组过后的数据里展示表B里价格最低的name(最低的价格已用min(B.price)获得,但B.name没有对应最低价格的那条数据)


非常抱歉,由于原表数据多,所以想精简一下来问,结果写错了,已更正!
有几个朋友没懂我的需求,解释一下:每个A有多个B,我需要查询A里面价格最低的B记录(同时要关联A),我现在的SQL查出来确实是B对应A价格最低的,但是B.name不是价格最低那条数据的name。。。咳咳,实在表达不清楚了。。。

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(4)
阿神

having
我理解的意思题主的意思时说在 group by 的基础上继续过滤结果, 你需要 having

迷茫

试试这样呢。

select a.title, t.name, t.price from a 
inner join (select * from b order by id, price ) t on t.id = a.b_id 
group by a.b_id;
黄舟

你这个分组的SQL语句有语法上的错误,虽然这条语句MYSQL不会报错,用GROUP的时候出现在SELECT后的列名必须出现在聚合函数中或者是作为GROUP的条件列才对。

问题描述的不清楚,不知道你到底是要找表里的最小价格还是每个分组里的价格。 如果是要找每个name的最小price那么:
SELECT B.name,min(B.price) AS min_price FROM B GROUP BY B.name ORDER BY min_price AS
以B.name分组,找到每个组里的最低价格。 然后再用B.name获取需要的A表里的数据。

黄舟
sql
select a.id aid, a.title, tmp_b.id bid, tmp_b.name, tmp_b.price from A a join ( select b.* from B b join (select b.a_id, min(b.price) price from B b group by b.a_id) tb on b.price = tb.price ) tmp_b on tmp_b.a_id = a.id
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号