我有桌子,
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的情况下获得所需的结果?
答案 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)