求一条关联SQL的写法?

wu52398 2019-06-21 06:22:17





以上两张表分别A,B

想找出A表中所有authorid为8的记录,并在每条记录结果栏中关联显示出B表内的数据

select `a`.`id`,`a`.`sourcename`,`a`.`authorid`, b.id AS b__id,b.uid AS b__uid,b.cid AS b__cid from `ts_wffiles` a LEFT JOIN `ts_checkin` b on a.id=b.cid where a.authorid=8 GROUP BY id order by id desc

得出的结果是:


我想要得到的结果是红色框中的记录应该为上个图中红色框内的记录,也就是取出B表中ID为10的记录,这里取出的是ID为9
但是如果我在WHERE后面连接一个and b.uid=8,却又把left join取出来的A表记录过滤了下,我想保持A表中的所有记录的同时把B表中符合uid=8的记录取出来。


求SQL写法
...全文
133 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
YYYYolanda 2019-07-01
  • 打赏
  • 举报
回复
你用 LEFT JOIN ,能查出a表的所有数据。而a.id=b.cid 且GROUP BY id(理应为GROUP BY a.id),说明你将表b的多条cid相同的数据group by 分组了。分组留下的一条数据,官方给的回复是ANY_VALUE()。也就是说,分组后返回的数据没法指定。
如果你非要指定返回哪一条数据,只能先处理表b的分组。

表b分组选取id大的为返回数据
(SELECT max(id) FROM `ts_checkin`  GROUP BY cid)


表b返回只剩分组中id大的数据的完整表,用此表代替`ts_checkin`
(SELECT * FROM `ts_checkin`  WHERE id IN (SELECT max(id) FROM `ts_checkin`  GROUP BY cid))


完整的语句
select `a`.`id`,`a`.`sourcename`,`a`.`authorid`, b.id AS b__id,b.uid AS b__uid,b.cid AS b__cid from `ts_wffiles` AS a LEFT JOIN (SELECT * FROM `ts_checkin`  WHERE id IN (SELECT max(id) FROM `ts_checkin`  GROUP BY cid)) AS b on a.id=b.cid where a.authorid=8 GROUP BY id order by id desc


以上方法,只能返回表b的id大的数据。如果表b的cid参数相同的数据很多,分组之后,你想返回任意一条数据,那你就另外处理表b的分组。越复杂对性能越有影响。

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧