2 first773 first773 于 2017.08.28 16:33 提问

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个回答

z342401436
z342401436   2017.08.28 17: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是想查这两种数据,合并在一个结果集里边……

first773
first773 没错,这样效率会比较快吗
3 个月之前 回复
weixin_38221608
weixin_38221608   2017.08.28 16:44

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

select * from menu A
left join menu B 
on A.product= B.product;

first773
first773 *号只是比喻而已,我在实际操作没用*号,你这样写不是我想要的结果啊
3 个月之前 回复
weixin_38680031
weixin_38680031   2017.08.28 16:49

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

huang931027
huang931027   2017.08.28 16: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
li_ling_ren   2017.08.28 17:07

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


select distinct m.*
  FROM menu m
  left join menu pm
    on m.menuid = pm.parentid
 where m.name = 'product'

weixin_37697279
weixin_37697279   2017.08.28 18:12

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

csdn_duanjiao2016
csdn_duanjiao2016   2017.08.28 18:15

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

Csdn user default icon
上传中...
上传图片
插入图片