1

我有桌子,

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

4 回答 4

1

据我所知,如果不使用联合,就不可能按照您的建议获得 MySQL 结果集。

这个问题读起来更像是一个谜题(家庭作业),而不是一个真正的编程问题——为什么 UNION 不可用?为什么要直接从 PHPMyAdmin 或 mysql 命令行客户端等通用工具访问数据?一旦你在顶层实现了一层代码,比如表示和访问控制,不使用 UNION 就很简单了——但使用 UNION 语句可能会简单得多:你为什么要问?

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

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

更新3

没人知道吗?

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;

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

于 2013-01-16T12:32:38.200 回答
0

尝试使用 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
于 2013-01-16T12:26:13.910 回答
0

使用IF条件...

SELECT 
      id, 
      OpenDate as Open_Date, 
      IF (CloseDate, 'close', 'open') as Close_Date, 
      IF (CloseDate, CloseDate, '') as type 
FROM table;
于 2013-01-16T12:28:02.743 回答
0

看来你给我们难题了。当有 UNION 关键字可用时,为什么要使查询变得复杂。如果您给我们一个难题,我的答案是使用“UNION ALL”。

于 2013-01-16T13:24:19.150 回答