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 ステートメントを使用するとはるかに簡単になります。

UPDATEUNION を使用しないという問題の解決策がありますが、これは宿題/面接の質問であることを明らかにしています。

更新 2 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

使用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

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

あなたは私たちにパズルを与えているようです。UNION キーワードが利用可能であるのに、なぜクエリを複雑にする必要があるのか​​。あなたが私たちにパズルを与えるなら、私の答えは「UNION ALL」を使うことです.

于 2013-01-16T13:24:19.150 に答える