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

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 关于#vscode#的问题:ESP32开发板对接MQTT实现小灯泡的开关
  • ¥15 TMC2209串口模式下读取不到寄存器的值串口助手蓝色字体是发过去的消息,绿色字体是收到的消息,第二行发送读取寄存器的指令但是没有读取到寄存器的值串口助手如下图:接线如下图,如何解决?
  • ¥15 高通安卓11提取完整线刷包软件,或者优博讯dt50顺丰刷机包
  • ¥20 C,有个译码器,换了信道就跑不出原来数据
  • ¥15 MIMIC数据库安装问题
  • ¥60 基于JTag协议开发Fpga下载器上位机,哪位大🐂有偿指导?
  • ¥20 全书网Java爬取数据
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题
  • ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏