0

この問題に対する回答をオンラインで検索するのに多くの時間を費やしましたが、役立つものは何も思いつかないようです。

私はmySQLにかなり慣れていないので、十分な知識がありません。

、、、、 、 のevents6 つの列を持つテーブルがあります。idevent_nameevent_dateevent_close_timeevent_linkevent_image

イベントが今日行われている場合は、event_close_time が < 現在の時間であるデータベースからすべてを選択し、将来の他のすべてのイベントを選択しようとしています。

私が思いついたのは次のとおりです。

SELECT * FROM `events` 
WHERE `event_date` >= 'todays_date'
AND `event_close_time` >  'current_time'
ORDER BY `event_date`

しかし、これは私がやりたいことを正確に行いません。終了時刻が現在の時刻より早い場合に限り、今日または将来のすべてのイベントを返します。

最後の ORDER BY 句を使用すると、Web アプリケーションで使用したい順序でイベントを並べ替えることができるため、1 つのクエリで実行することが重要です。

望ましい結果を得るために必要な調整を誰か指摘できますか?

4

2 に答える 2

1

selectこれは、正しいwhere句を使用して行う必要があります。

SELECT *
FROM `events` 
WHERE (event_date = CURDATE() AND event_close_time < CURTIME()) or
      (event_date > CURDATE())
ORDER BY `event_date`;

ororを使用してロジックを実装するのは悪い習慣です。まず、条件ごとに 1 回ずつ、テーブルを 2 回スキャンする必要があります。シングルは、テーブルを 1 回だけスキャンします。unionunion alleventswhere

于 2013-07-07T12:24:50.767 に答える
0

これはどう?

SELECT *
FROM events
WHERE event_date = CURDATE()
AND event_close_time < CURTIME()
UNION ALL 
SELECT * 
FROM events 
WHERE event_date > CURDATE()
ORDER BY event_date

これは のOR代わりに を使用することもできますUNION ALLが、OR を使用すると (少なくとも MySQL では) インデックスが使用されなくなるため、UNION の方が効率的である傾向があることがわかりました。

于 2013-07-07T03:03:37.727 に答える