Mysql--A、B联查,查询以A_ID为分组的最新一条记录,并且A表所有数据都展示出来

问题描述:

  • 数据库有表A、表B。
    在这里插入图片描述
    在这里插入图片描述
  • 业务需求一(针对B表):
  1. b_status = 1
  2. 以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
  • 业务需求二:
  1. 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
发布了8 篇原创文章 · 获赞 0 · 访问量 212

猜你喜欢

转载自blog.csdn.net/Dawn____Dawn/article/details/103678910
今日推荐