如果没有UNION,需要获得理想的结果

时间:2013-01-16 12:23:56

标签: mysql select

我有桌子,

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我们可以实现这一点,但是如何在不使用UNION的情况下获得所需的结果?

4 个答案:

答案 0 :(得分:1)

据我所知,如果不使用联合,就不可能得到MySQL结果集。

问题更像是拼图(家庭作业),而不是真正的编程问题 - 为什么UNION不可用?为什么要直接从PHPMyAdmin或mysql命令行客户端等通用工具提供对数据的访问?一旦你有一层代码在顶层实现诸如表示和访问控制之类的东西,没有使用UNION就可以了 - 但是使用UNION语句可能要简单得多:你为什么要问?

<强>更新 我已经解决了不使用UNION的问题 - 但这很明显这是一个家庭作业/面试问题。

<强> UPDATE2 由于LearneR发布(然后删除)另一个问题暗示他对UNION查询的表现不满意,因此不太可能成为家庭作业/面试问题。但仅仅为了娱乐价值,我会推迟发布我的解决方案,直到后来看看是否有其他人可以解决这个难题(提示:我的解决方案根本不应该提高查询的性能 - 这只是一个试图获得的学术练习不使用UNION所需的结果。

<强> UPDATE3

没有人知道吗?

SELECT t.id
,        IF(rowmultiplier.id=1, t.opendate, t.closedate) AS `date`
,        IF(rowmultiplier.id=1, 'Open', 'Close') AS `type`
FROM yourtable t
,    (SELECT id
    FROM yourtable AS tablealias
    WHERE id IN (1,2) ) AS rowmultiplier
WHERE rowmultiplier.id=1
OR t.closedate IS NOT NULL;

(在没有任何排序/过滤的情况下,有一些调整范围,然后强制外部查询的完整表表扫描,内部查询的索引查找可以使它比联合查询快得多)

答案 1 :(得分:0)

尝试使用case Statement http://dev.mysql.com/doc/refman/5.0/en/case.html

可能是(未经测试)

select date,
    case time(formatted_timefield)
        when between '07:00:00' and '18:00:00'
        then 'open'
        else 'close'
    end case

所以你可以使用多次检查,如

select 
CASE WHEN 1=1 AND 2=2 THEN 'open' ELSE 'closed' END
from Table

所以尝试像

这样的东西
select
    date,
    CASE WHEN OpenDate < now() AND CloseDate > now() THEN 'open' ELSE 'closed' END
from
    table

答案 2 :(得分:0)

使用IF条件......

SELECT 
      id, 
      OpenDate as Open_Date, 
      IF (CloseDate, 'close', 'open') as Close_Date, 
      IF (CloseDate, CloseDate, '') as type 
FROM table;

答案 3 :(得分:0)

好像你给我们拼图了。 为什么要在UNION关键字可用时使查询复杂。 如果你给我们一个谜题,我的答案是使用'UNION ALL'。