码兄 2017-08-28 08:33 采纳率: 50%
浏览 2167
已采纳

mysql语句优化,in语句多表查询优化

比如我要查一张菜单表,想查询名字为‘product’和子菜单名字为‘product’的菜单,下面是我写的语句。
请问这种怎么用join才代替in,或者有没有别的办法让效率变得高点

select * FROM menu As m where m.name = 'product' or m.menuid in (SELECT parentid FROM menu where name='product')

语句只是做个比喻,因为业务比较复杂,所以随便写个例子

  • 写回答

7条回答

  • 光明下的影子 2017-08-28 09:08
    关注

    首先我根据你的SQL理解一下你的业务逻辑
    select *
    from menu m
    where m.name = 'product'
    or m.menuid in (select parentid from menu where name = 'product');

    用or就是2个数据都想要
    第一种是:menu表中 name = 'product' 的数据
    第二种是:menu表中 menuid in (select parentid from menu where name = 'product')的数据,in中的表和in外的表是同一个表

    拆分成2个SQL,就是这样
    select m.*
    from menu m
    where m.name = 'product';

    select t1.*
    from menu t1
    left join menu t2
    on t1.menuid = t2.parentid
    where t2.name = 'product';

    大概理解你的SQL是想查这两种数据,合并在一个结果集里边……

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置