MySQL 求助, group by 城市行业后获取工资最低的一条数据

2019-09-11 13:51:36 +08:00
 sytnishizuiai

例如字段有 id,city,business,money 4 个字段,我想要获取各个 city 下不同 business 下的最低 money 并得到 id,

我试了好几种方法,每次获取的值都是 id 靠前的,即便使用 MIN ( money ),id 也是无法对应。

5116 次点击
所在节点    MySQL
34 条回复
Keppel
2019-09-11 13:58:00 +08:00
你可以试试 having
newtype0092
2019-09-11 14:02:54 +08:00
按理说 group by 操作后应该只使用 group by 的列,如果要用到其他列就应该在 group by 之前先排序。
sytnishizuiai
2019-09-11 14:04:50 +08:00
@Keppel having 只能操作 group by 内的列,所以用不了
@newtype0092 这个看过别人写,我自己试过用复合 sql,先根据 money 排序,然后 group by,还是没用
newtype0092
2019-09-11 14:06:54 +08:00
select * from (select * from T order by money) tmp group by city, business;
大概这样
newtype0092
2019-09-11 14:11:19 +08:00
@sytnishizuiai 我自己的数据这种写法是 ok 的,你那边没用的话有没有具体的 case 啊
dengzhaohui
2019-09-11 14:14:23 +08:00
@newtype0092 MySQL5.7 优化掉了子查询内的 order by,大部分说加上 limit 或 distinct 就能强制排序,然鹅我试过并没有用 排序分组难搞
sytnishizuiai
2019-09-11 14:20:04 +08:00
sytnishizuiai
2019-09-11 14:23:01 +08:00
@dengzhaohui 超级感谢,你一下子说中要害了,我去查了下果然好多人说(昨天关于这个问题查了好久),现在加上 limit 就可以了
ayonel
2019-09-11 14:37:26 +08:00
新建表:
CREATE TABLE `demo` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`city` varchar(11) DEFAULT NULL,
`business` varchar(11) DEFAULT NULL,
`money` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入以下数据:
id city business money
1 beijing waimai 10
2 beijing dache 20
3 beijing dache 30
4 beijing waimai 40
5 beijing waimai 20

按照楼主的意思,需要返回的结果是:id=3 以及 id=4 的记录


思路:自己 left join 自己,将统一分组的记录 join 一起,并且加一个过滤条件 左表的 money < 右表的 moeny, 这样的结果是所有符合该条件的关联记录中,右表都会有值。最终只需要挑右表中任意字段为 null 的记录就行了。

sql:
select a.* from demo a left join demo b on a.city=b.city and a.business=b.business and a.money < b.money where b.money is null;

结果:
3 beijing dache 30
4 beijing waimai 40
xux9311
2019-09-11 14:39:49 +08:00
要 group by 字段外的信息么,原来的表 join 一下吧
大概这样
```sql
select business.id, business.money from business join (select city, min(money) as min_money from business group by city) as temp on business.city = temp.city and business.money = temp.min_money;
```
ayonel
2019-09-11 14:41:36 +08:00
gz911122
2019-09-11 14:43:18 +08:00
升 8.0
然后用开窗函数

换 pg
sytnishizuiai
2019-09-11 14:43:27 +08:00
@ayonel 谢谢,这个方法我看到过但没试,因为项目的表很大 本身就是 2 表关联查询,会变的更复杂就没考虑了。
sytnishizuiai
2019-09-11 14:46:29 +08:00
@xux9311 类似的方案我试过,里面那个 select group by 的时候,得到的 min(money)和 city 其实不是匹配的
sytnishizuiai
2019-09-11 14:47:42 +08:00
@ayonel 这个答案 5.7 不能用了,就是 4 楼的,现在加个 limit 就行
jadec0der
2019-09-11 14:47:49 +08:00
先排序,再 group by,用了 ls 的表和数据

http://www.sqlfiddle.com/#!9/4aaa7f/4
newtype0092
2019-09-11 14:49:51 +08:00
@dengzhaohui 我的版本还是 5.6,用 5.7 试了一下,group by 语句里 select 其他字段直接报 ERROR 了。。。
ayonel
2019-09-11 14:50:31 +08:00
@sytnishizuiai 为什么不能用,我就用的 5.7
ayonel
2019-09-11 14:54:05 +08:00
@jadec0der 这种写法默认的 mysql 5.7 开启了 ONLY_FULL_GROUP_BY 参数,会报错。
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 't.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
sytnishizuiai
2019-09-11 14:55:06 +08:00
@gz911122 我去学习下

@jadec0der 我 5.7 就不行了

@ayonel 不好意思,我就看了第一个,第一个不行的 我试了好几遍,第二个答案和 9 楼的想法一样,学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/600001

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX