问个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
我现在不知道怎么去写判断语句

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 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;

2个月前 评论
讨论数量: 13

那么问题在哪里?

3个月前 评论
donggan (楼主) 3个月前
轻描淡写 (作者) 3个月前

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

3个月前 评论
donggan (楼主) 3个月前

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

3个月前 评论
select  *  from a  join b where a.type=1
union
select  *  from a join c  where a.type=2

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

3个月前 评论

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

3个月前 评论

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

3个月前 评论

这是不典型的多态关联吗

3个月前 评论

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

3个月前 评论

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

3个月前 评论
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 用于过滤无效关联,优化查询速度

3个月前 评论

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;

2个月前 评论

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