first773
码兄
采纳率50%
2017-08-28 08:33 阅读 2.0k

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

5

比如我要查一张菜单表,想查询名字为‘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条回答 默认 最新

  • 已采纳
    z342401436 光明下的影子 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是想查这两种数据,合并在一个结果集里边……

    点赞 评论 复制链接分享
  • weixin_38221608 buyax 2017-08-28 08:44

    你要说优化的的话, 就不要用星号(*),用字段代替

    select * from menu A
    left join menu B 
    on A.product= B.product;
    
    
    点赞 评论 复制链接分享
  • weixin_38680031 java美女 2017-08-28 08:49

    我下面这个sql是只有有主菜单的基础上才会有子菜单的名字哈
    select * from parent up left join Child upi
    on up.id = upi.parent_id
    where up.name ='product'

    点赞 评论 复制链接分享
  • huang931027 IAmObject 2017-08-28 08:53

    我记得oracle里有一个优化,就是把已知的条件都放在where的最后面。例如
    select * FROM menu As m where m.menuid in (SELECT parentid FROM menu where name='product') or m.name = 'product'
    这样可以做到提高效率,但是我不知道MySQL是不是也可以这样优化,你参考一下。

    点赞 评论 复制链接分享
  • li_ling_ren 请叫我站长 2017-08-28 09:07

    用左外连接,然后去重操作,实测望采纳

    
    select distinct m.*
      FROM menu m
      left join menu pm
        on m.menuid = pm.parentid
     where m.name = 'product'
    
    
    点赞 评论 复制链接分享
  • weixin_37697279 进击的小程序员 2017-08-28 10:12

    不建议用子查询,子查询索引失效,肯定会慢,用自连接吧

    点赞 评论 复制链接分享
  • csdn_duanjiao2016 csdn_duanjiao2016 2017-08-28 10:15

    要查一张菜单表,想查询名字为‘product’和子菜单名字为‘product’的菜单
    从你的业务上面可以发现你又两个控制条件:
    1.当前的查找的本身的name是要等于‘product’
    2.或者查找到所有的子菜单的name为‘product’的记录
    所有我们可以这么写,因为当前的逻辑是或者,因此我们是要使用的是or,而or这种条件似乎是不能使用join这种语句的吧!!!

    点赞 评论 复制链接分享

相关推荐