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
的相应单个查询更快?