我有一个表,
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的情况下获得所需的结果?
据我所知,如果不使用union,就不可能获得MySQL结果集。
这个问题读起来更像是一个谜题(作业)而不是一个真正的编程问题——为什么UNION不可用?为什么要直接从PHPMyAdmin或mysql命令行客户端等通用工具提供对数据的访问?一旦在上面有了一层代码来实现诸如表示和访问控制之类的东西,那么不使用UNION就很简单了——但使用UNION语句可能会简单得多:为什么要问这个问题?
对于不使用UNION的问题,我已经有了一个解决方案——但这显然是一个家庭作业/面试问题。
更新2 因为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;
(在没有任何排序/过滤的情况下,有一些调优的余地,那么强制对外部查询进行全表扫描,并对内部查询进行索引查找,可能会使其比联合查询快得多)。
Use IF
condition…
SELECT
id,
OpenDate as Open_Date,
IF (CloseDate, 'close', 'open') as Close_Date,
IF (CloseDate, CloseDate, '') as type
FROM table;
尝试使用case语句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
看来你给我们出了难题。当有UNION关键字可用时,为什么要使查询变得复杂。如果你给我们一个难题,我的答案是使用'UNION ALL'