2013-01-16 48 views
0

我有表像,如何在查询优化中获得MySQL组合结果?

id | OpenDate    | CloseDate 
------------------------------------------------ 
1 | 2013-01-16 07:30:48 | 2013-01-16 10:49:48 
2 | 2013-01-16 08:30:00 | NULL 

我需要如下

id | date     | type 
--------------------------------- 
1 | 2013-01-16 07:30:48 | Open 
1 | 2013-01-16 10:49:48 | Close 
2 | 2013-01-16 08:30:00 | Open 

我使用UNION得到上面的输出(我们可以实现无工会吗?)

SELECT id,date,type FROM(
    SELECT id,`OpenDate` as date, 'Open' as 'type' FROM my_table 
    UNION ALL 
    SELECT id,`CloseDate` as date, 'Close' as 'type' FROM my_table 
         )AS `tab` LIMIT 0,15 
得到综合作用的结果

我正在得到所需的输出,但现在在性能方面 - >我在我的表中有4000条记录,并通过完成它的组合并给出大约8000条记录,这使得ve ry加载网站缓慢(超过13秒)。我怎样才能优化这个查询来紧固输出?

我在子查询中尝试了LIMIT,如果我在子查询中使用LIMIT,分页偏移量也不能正常工作。请帮我解决这个问题。

更新

EXPLAIN结果

id select_type table  type key key_len ref  rows Extra 
1 PRIMARY  <derived2> ALL NULL  NULL  NULL 8858  
2 DERIVED  orders  index OpenDate 4  NULL 4588 Using index 
3 UNION  orders  index CloseDate 4  NULL 4588 Using index 
NULL UNION RESULT<union2,3> ALL NULL  NULL  NULL NULL  
+0

你要限制行的量来选择? 'SELECT TOP 100'也许? – TheGeekZn

+0

@NewAmbition否我想选择所有记录 –

回答

1

我会做类似如下:

SELECT 
    id, 
    IF(act, t1.OpenDate, t1.CloseDate) as `date`, 
    IF(act, 'Open', 'Close') as `type` 
FROM my_table t1 
JOIN (SELECT 1 as act UNION SELECT 0) as _ 
JOIN my_table t2 USING (id);