1

私は、人々がイベントにサインアップできるようにする定期的なイベントカレンダーを持っています。私は2つのテーブルを持ってdynamic_eventsおりrecurring_events、次の構造になっています。

dynamic events
id (int)
date (date)
time (time)
title (varchar[255])
desc (text)
max_attendees (int)
is_overwrite (tinyint[1])

recurring events
id (int)
day_of_week (int)
time (time)
title (varchar[255])
desc (text)

定期的なイベントが更新されるたびに、テーブルに対して一意に識別するように動的にしattendeeます。現在の仕組みは、その日のすべての動的イベントをクエリしてから、その日のすべての定期的なイベントをクエリし、配列をPHP関数に渡して、日付と時刻が一致する場合は、定期的なイベントを動的イベントに置き換えます。とis_overwriteは1に等しいです。基本的に、その日時の定期的なイベントが更新され、人々がサインアップできるようになったことを意味します。これは機能しますが、ある種の左結合を使用してPHPがなくてもこれが可能かどうか疑問に思いました。他のすべてのイベントを保持しながら、動的に対応する行を上書きするために、繰り返しテーブルの行を置き換えますか?どうすればいいのかわからず、正しい方向への一歩を探していました。うまくいけば、私は私の外植であまり混乱していません。

4

2 に答える 2

1

はい、できます。呼び出しで左結合を使用しifnull()て、上書きを実行します。

select
    ifnull(d.time, r.time) as time,
    ifnull(d.title, r.title) as title,
    ifnull(d.desc, r.desc) as desc
from recurring_events r
left join dynamjc_events d on dayofweek(d.date) = r.day_of_week
    and d.time = r.time

列が異なるため、「上書き」は完全には不可能であることに注意してください。ただし、いずれかのテーブルから必要な列を選択する必要があります。一致するものがない場合、動的イベントの場合はnullになります。

于 2012-12-17T22:52:27.040 に答える
0

これが1つのアプローチです:

SELECT IF(d.id IS NOT NULL,'d','r')         AS dynamic_or_recurring
     , IF(d.id IS NOT NULL,d.id,r.id)       AS id
     , IF(d.id IS NOT NULL,d.title,r.title) AS title
     , ...
  FROM recurring_events r
  LEFT
  JOIN dynamic_events d
    ON d.time = t.time AND DAYOFWEEK(d.date) = r.day_of_week

SELECTリストには、各テーブルの列のみを含めることができ、返されたインジケーターに応じて、必要な列のセットを選択します...

SELECT IF(d.id IS NOT NULL,'d','r')      AS dynamic_or_recurring
     , d.id                              AS d_id
     , d.date                            AS d_date
     , d.time                            AS d_time
     , ...
     , r.id                              AS r_id
     , 
于 2012-12-17T22:51:23.887 に答える