0

イベントのテーブルがあり、それぞれに開始日と終了日があります。

日のリストを表示し、各日に発生しているイベントを表示する必要があります。

たとえば、月~水を実行するイベントと、火~木を実行する別のイベントがあるとします。次のようなテーブルを作成しようとしています。

Mon: Event 1
Tue: Event 1, Event 2
Wed: Event 1, Event 2
Thu: Event 2

これを行う唯一の方法は、毎日クエリを実行するか、特定の日付範囲のすべてのイベントをロードし、それらが 1 日以上続く場合はコードで複製することです。どちらのアプローチもハッキリしているようで、何かが欠けていると確信しています。

これを行うためのよりきちんとした方法はありますか?

構造:

id         INT
name       VARCHAR
start_date DATE
end_date   DATE

現在のクエリ (このデータベース構造は恐ろしいため、少し単純化されています):

SELECT *
FROM events
WHERE start_date <= $somedate
AND end_date >= $somedate

... $somedate は特定の日付です。(はい、コードで適切にエスケープしています!)

4

4 に答える 4

1

おそらくもっと良い方法がありますが、頭のてっぺんから、可能な日付のテーブルを作成すると言います。

select * from events
 inner join possibleDates on possibleDates.Date >= start_date and possibleDates.Date <= end_date
于 2013-08-29T13:58:56.273 に答える
1

必要に応じて 1 つのクエリで実行できますが、Jan Zeiseweis も提案しているような平日のテーブルを取得することをお勧めします。ワーキング SQLfiddle: http://www.sqlfiddle.com/#!2/e618d9/1/0

SELECT wk.day, GROUP_CONCAT(e.name, '') events
FROM (
  SELECT 'Monday' day, 0 dayIndex
    UNION
  SELECT 'Tuesday' day, 1 dayIndex
    UNION
  SELECT 'Wednesday' day, 2 dayIndex
    UNION
  SELECT 'Thursday' day, 3 dayIndex
    UNION
  SELECT 'Friday' day, 4 dayIndex
    UNION
  SELECT 'Saturday' day, 5 dayIndex
    UNION
  SELECT 'Sunday' day, 6 dayIndex
) wk
LEFT JOIN Events e
   ON WEEKDAY(e.start) <= wk.dayIndex
  AND WEEKDAY(e.end) >= wk.dayIndex
GROUP BY wk.day ORDER BY wk.dayIndex
于 2013-08-29T15:37:06.753 に答える
1

まず、おそらく各イベントの start_date から end_date までのすべての日付を取得する必要があります。一時的に入れます。次のようなテーブル:

|Weekday| Event_name|
|Mo     | Event1    |
|Tu     | Event1    |
|We     | Event1    |
|We     | Event2    |
|Th     | Event2    |
|Fr     | Event2    |

次に、平日に group_by でイベントを group_concat します。

このリンクは、各イベントの開始日と終了日の間の日付を取得するのに役立ちます。: 2 つの日付間の日付のリストを取得する

于 2013-08-29T13:53:46.230 に答える