问题描述:
- 数据库有表A、表B。
- 业务需求一(针对B表):
- b_status = 1
- 以a_id为分组查询时间最新的一条记录
- mysql(5.7.28版本):
#注意:不添加 LIMIT 不生效
SELECT bb.a_id,bb.id,bb.b_status,bb.b_time
FROM(
SELECT id,b_status,a_id,b_time
FROM b
WHERE b_status = 1
ORDER BY b_time LIMIT 100000
) bb
GROUP BY bb.a_id
可能出现问题:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
'bb.id' which is not functionally dependent on columns in GROUP BY clause; this is
incompatible with sql_mode=only_full_group_by
原因:
出现这个错误的原因是你本地的mysql 版本高于你使用的sql 版本,最好使用5点几的版本。
解决:
- mysql(高于5.x.x的版本):
# any_value 函数取分组后的第一行
SELECT b.a_id,any_value(b.id),any_value(b_status),any_value(b_time)
FROM b
GROUP BY b.a_id
- 业务需求二:
- A表的所有数据都要显示出来,B表没有的数据为null
- mysql(5.7.28版本):
SELECT a.id,bb.id,bb.b_status,bb.b_time
FROM a LEFT JOIN
(
SELECT id,b_status,a_id,b_time
FROM b
WHERE b_status = 1
ORDER BY b_time LIMIT 100000
) bb
ON a.id = bb.a_id
GROUP BY bb.a_id
- mysql(高于5.x.x的版本):
# any_value 函数取分组后的第一行
SELECT a.id,any_value(b.id),any_value(b_status),any_value(b_time)
FROM a left join b
on a.id = b.a_id
GROUP BY a.id