2011-05-30 92 views
0

以下2个查询有什么区别? (它们都产生相同的结果)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 

VS

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 

回答

3

第一个版本还有另一组临时表,这是无用的,资源在这种特殊情况下的浪费。
以下所有会产生相同的结果:

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 
+0

临时表?我很确定两个查询都会产生相同的执行计划。 – Magnus 2011-05-30 16:56:24

+0

原件不应该优先考虑按名称找到的物品。 – 2011-05-30 17:01:37

+0

@Jonathan Leffler你是对的,编辑 – 2011-05-30 17:04:21

0

第一个查询嵌入了一个额外的一套SELECT * FROM (sub-query)。优化器需要稍微长一些的时间来整理它。

在功能上,查询之间没有真正的区别。第二个更简单,因此更可取。

0

我看到的唯一区别是在顶部,UNION的子查询组件被命名。显然,由于第二个版本没有错误,所以MySQL在这个构造中不需要子查询名称。顺便说一句,你有没有测试过这个版本比使用OR的相应单个查询快?