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

首先我根据你的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
码兄 没错,这样效率会比较快吗
大约 2 年之前 回复

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

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

first773
码兄 *号只是比喻而已,我在实际操作没用*号,你这样写不是我想要的结果啊
大约 2 年之前 回复

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

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

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


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

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!