问个mysql一个有趣的查询

就是我现在需要联查两张表A,B,C表
就是我需要根据A表中一个字段的值比如type,
当type为1时,我就
left join B表,
当type为2时,我就
left join C表
这个sql语句这么写的
select * from A left join B on A.op_id = B.id
select * from A left join B on A.op_id = c.id
我现在不知道怎么去写判断语句

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

select A.id as AId, A.title as ATitle, concat_ws('',B.name, C.name) as name from A

left join B on A.typeId = B.id and A.type =1

left join C on A.typeId = C.id and A.type =2;

4年前 评论
讨论数量: 13

那么问题在哪里?

4年前 评论
donggan (楼主) 4年前
轻描淡写 (作者) 4年前
chowjiawei

要不你就laravel写if,要不你就mysql写if

4年前 评论
donggan (楼主) 4年前

用$model->when($type==1,function($query){$query->join('a')}) ->when($type==2,function($query){ $query->join(b) })

4年前 评论
select  *  from a  join b where a.type=1
union
select  *  from a join c  where a.type=2

可以实现 但你这个架构感觉有问题

4年前 评论

你这个是一对多的多态,按照文档里来操作就可以。模型关联《Laravel 8 中文文档》

4年前 评论

select * from A left join B on A.op_id = B.id AND A.type = 1 这种on A.type = 1 不知道可不可以没试过,可以的话继续连表 :joy:

4年前 评论

这是不典型的多态关联吗

4年前 评论

某一次查询a表的时候 是不是里面的数据有的type为1有的为2,然后各自去关联;还是说只会都是1或者2

4年前 评论

我明白了 只需要关联模型就行 $modelA->with(['modelb','modelc'])->get() 查询出来自行判断

4年前 评论
SELECT 
    A.id as id,
    CASE WHEN A.type = 1 THEN B.id ELSE C.id END AS rel_id,
    CASE WHEN A.type = 1 THEN B.name ELSE C.name END AS rel_name
FROM A 
LEFT JOIN B on A.id = B.a_id AND A.type = 1
LEFT JOIN C on A.id = C.a_id  AND A.type = 2 

CASE WHEN 主要根据条件摘出对应值,
LEFT JOIN AND 用于过滤无效关联,优化查询速度

4年前 评论

select A.id as AId, A.title as ATitle, concat_ws('',B.name, C.name) as name from A

left join B on A.typeId = B.id and A.type =1

left join C on A.typeId = C.id and A.type =2;

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!