1

午前 9 時以前の投稿の質問については助けてもらいましたが、新しい質問があります。私の説明で我慢してください....

セットアップ、2 つのテーブル:cal_eventsカレンダーの動的イベントと、1 日の更新が行われる繰り返しイベントを保持します。また、cal_events_recurring定期的なイベントを開催します。以下のクエリは、PHP によって渡されるダミー データを使用した例です。12 月 15 日に基づいているので、その日のすべてのイベントを返します。重要な部分は、一致する動的な対応がない場合にのみ繰り返しイベントが返されることです。cal_events, is_overwrite= 1 とそのoverwrite_id= (午前 9 時のイベントの一意の ID) の場合cal_events_recurring、動的テーブル行のみが返されます。これは、「ねえ、私は毎日午前 9 時に発生するイベントです (例)、しかし、ほら、12 月 15 日に、その日の 9:00 の定期的なイベントが、動的テーブルに基づいて更新されたoverwrite_idので、そのテーブルに私の一意の ID = を返します。」

select * from(
    select
        ifnull(ce.time, cer.time) as time,
        ifnull(ce.title, cer.title) as title,
        ce.is_overwrite
    from cal_events_recurring cer
    left join cal_events ce on ce.overwrite_id = cer.id
    where cer.is_daily = 1
    or cer.day_index = 6
    or cer.day_num = 15
    union
    select time as time, title, is_overwrite 
    from cal_events where date = '2012-12-15' 
    and is_active = 1 and is_overwrite = 0) as e order by time asc

これで問題ありません。データは正しく、問題はis_activeフィールドです。再び午前 9 時の例から離れます。16 日の定期的なイベントを上書きする 16 日の午前 9 時の動的イベントを作成しました。後で通常の定期的なイベントに戻すことにした場合is_activeは、一致する動的イベントのフィールドを 0 に設定します。問題は、動的イベントがまだ返されることです。追加and ce.is_active = 0しても、イベントは返されます。対応する動的イベントがアクティブでない場合でも繰り返しイベントを返すようにするには、どのように記述すればよいでしょうか?

他に必要な情報があれば教えてください!

EDIT* 出力:

time      title 
08:00:00  recurring everyday 8am
09:00:00  dynamic 9am update 

(9am should be the recurring event because the dynamic    is_active = 0)
4

1 に答える 1

2

その条件をON句に入れます:

select * from(
    select
        ifnull(ce.time, cer.time) as time,
        ifnull(ce.title, cer.title) as title,
        ce.is_overwrite
    from cal_events_recurring cer
    left join cal_events ce on ce.overwrite_id = cer.id
        and ce.is_overwrite = 1     -- Added this line
    where cer.is_daily = 1
    or cer.day_index = 6
    or cer.day_num = 15
    union
    select time as time, title, is_overwrite 
    from cal_events where date = '2012-12-15' 
    and is_active = 1 and is_overwrite = 0) as e order by time asc
)

特別な条件を結合条件に入れると、左結合が得られますが、結合する必要がある行に対してのみです。

where句に条件を指定すると、左結合との意図が「破られ」ます。そのifnull()理由は次のとおりです。

結合の句の条件はON、結合が行われているときに実行されるため、結合したくない行は結合されず、それらの値がifnull()関数に組み込まれません。

結合条件は「キーに関連する」だけであるというのはよくある誤解ですが、実際には何でもかまいません。


条件をwhere句に入れると、結合が行われた後に実行されます(where句は結果セットをフィルタリングするため、遅すぎます) ifnull()。すでに動的テーブルのデータがあります。

于 2012-12-20T19:44:35.120 に答える