如何解决2个并集查询之间的差异
| 以下两个查询有什么区别? (它们都产生相同的结果)select *
from (
select * from (
select *
from phppos_items
where name like \'AB10LA2%\' and deleted = 0
order by `name` limit 16
) t
union
select * from (
select *
from phppos_items
where item_number like \'AB10LA2%\' and deleted = 0
order by `name` limit 16
) t
union
select * from (
select *
from phppos_items
where category like \'AB10LA2%\' and deleted = 0
order by `name` limit 16
) t
) as top_rows
order by `name` limit 16
与
select *
from (
(select *
from phppos_items
where name like \'AB10LA2%\' and deleted = 0
order by `name` limit 16)
union
(select *
from phppos_items
where item_number like \'AB10LA2%\' and deleted = 0
order by `name` limit 16)
union
(select *
from phppos_items
where category like \'AB10LA2%\' and deleted = 0
order by `name` limit 16)
) as top_rows
order by `name` limit 16
解决方法
第一个版本具有另一组临时表,在这种特定情况下,这是无用的并且浪费资源。
以下所有内容将产生相同的结果:
SELECT * FROM T1;
SELECT * FROM (SELECT * FROM T1);
SELECT * FROM (SELECT * FROM (SELECT * FROM T1));
...
...
到无穷远 :-)
在您的特定情况下,这就足够了:
select *
from phppos_items
where
(name like \'AB10LA2%\' OR item_number like \'AB10LA2%\' OR category like \'AB10LA2%\')
and deleted = 0
order by `name` limit 16
, 第一个查询嵌入了额外的SELECT * FROM (sub-query)
集。优化器将需要更长的时间来解决它。
从功能上讲,查询之间没有真正的区别。第二个更简单,因此更可取。
, 我看到的唯一区别是在顶部,命名了“ 5”的子查询组件。显然,由于第二个版本没有错误,因此MySQL在此构造中不需要子查询名称。顺便说一句,您是否测试过此版本比使用OR
的相应单个查询更快?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。