0

1 つのSQL クエリを作成しようとしていますが、常に3結果が得られます。データベースは次のとおりです。

uid | program_date | program_time | program_name
------------------------------------------------ 
1   | 2012-04-16   | 21:00        | Some movie
2   | 2012-04-16   | 23:00        | Program end
3   | 2012-04-17   | 10:00        | Animation
4   | 2012-04-17   | 11:00        | Some other movie
5   | 2012-04-17   | 12:00        | Some show

私が必要とするのは、常に 3 つの行があることです。したがって、今日が, ,2012-04-16 21:00と出力されるはずです。Some movieProgram endAnimation

で、、、2012-04-17 00:00が出力されるはずです。Program endAnimationSome other movie

問題は、レコードがない場合、1日で「ナビゲート」する必要があることですWHERE program_date = date("Y-m-d") AND program_time <= date("H:i:s");

別の問題があります - データベースには Unix タイムスタンプ フィールドがなくUidprogram_date(日付フィールド) とprogram_time(時間フィールド) とprogram_name.

また、Uidいくつかの番組エントリが既存の番組スケジュールの間に挿入される可能性があるため、 がテーブルに順番に挿入されない場合があります。

私はさまざまなアプローチを試みていますが、PHP でループすることなく、1 つの SQL クエリですべてを実行したいと考えています。

誰でもここで私を助けることができますか?

4

1 に答える 1

2

TV 関係者はかなり奇妙な方法で時間を数えて表示するため、MySQL 関数を作成して、人間以外の ;-) ロジックをより簡単に処理できるようにすることができます。

CREATE FUNCTION TV_DATE(d CHAR(10), t CHAR(5))
RETURNS CHAR(16) DETERMINISTIC
RETURN CONCAT(d, IF (t < "06:00", "N", " "), t);

ユーザー定義関数はデータベースごとに宣言され、これは一度だけ実行できます。DETERMINISTICは、関数が常に同じ入力に対して同じ結果を返すことを示しており、内部の MySQL オプティマイザーはそれに依存する可能性があります。N空白よりも(文字列比較で)大きい単なる文字です。nextまたはnightのニーモニックと考えてください。

: 時間は常に 2 桁でフォーマットする必要があります。

次に、この関数を使用して、必要なものをさらに簡単に選択できます。

-- what is on air now
(SELECT `program_name`, TV_DATE(`program_date`, `program_time`) AS `tv_time`
 FROM `table` 
 WHERE (`tv_time` <= TV_DATE(date("Y-m-d"), date("H:i"))
 ORDER BY `tv_time` DESC 
 LIMIT 1)

  UNION

-- next and upcomming
(SELECT `program_name`, TV_DATE(`program_date`, `program_time`) AS `tv_time`
 FROM `table`
 WHERE (`tv_time` > TV_DATE(date("Y-m-d"), date("H:i"))
 ORDER BY `tv_time` ASC
 LIMIT 0, 2)

DB 内のすべてのレコードが将来のものである場合、そのうちの 2 つしか取得できないことに注意してください。次のプログラムがDBの最後のプログラムである場合も同様です。

これら 2 つの状況を区別するために、クエリに異なる定数値を追加できます。

于 2012-04-17T19:49:11.123 に答える