0

このクエリが正しいかどうか疑問に思っています。n日前に投稿された人ごとのイベントごとに、最新のログエントリ(またはそのイベントにログを記録していない場合はNULL)の人(名前/電子メール)を選択しようとしています。テーブルの制約は次のとおりです。

  • イベントには一意の ID がありますが、複数のログ エントリを持つことができます。
  • イベントには複数のスタッフ メンバーが参加できます。
  • スタッフ メンバーは、複数のイベントに割り当てることができます。
  • スタッフ メンバーは、自分が参加しているイベントにのみログを記録します。
  • スタッフがイベントに参加している場合、date_dropped_event フィールドには「0」が入ります。スタッフ メンバーがイベントを終了すると、これはゼロ以外のタイムスタンプに変更されます。スタッフ メンバーが後でイベントに再び参加すると、タイムスタンプが「0」の新しい行が作成されます。

次のクエリを使用しています。

SELECT
     max(`log`.`date_added`) AS `logdate`,
     `log`.`description`,
     `eventppl`.`staff_id`,     

     `staff`.`name`,
     `staff`.`email`,

     `event`.`name`,
     `event`.`deleted`

FROM `events` AS `event`
     LEFT JOIN `logs` AS `log` ON `log`.`event_id` = `event`.`event_id`
     LEFT JOIN `events_people` AS `eventppl` ON `event`.`event_id` = `eventppl`.`event_id`
     LEFT JOIN `staff` AS `staff` ON `eventppl`.`staff_id` = `staff`.`staff_id`
WHERE 
    `event`.`deleted` = 0 AND
    `eventppl`.`date_left_event` = 0 AND
    DATE(FROM_UNIXTIME(`log`.`date_added`)) <= DATE_SUB(CURDATE(), INTERVAL 1 DAY)
GROUP BY `event`.`name`

次のテーブル構造があります。

ログ

  log_id   |   main_event_id  |  description        |  date            | staff_id
     1                    1          log entry         timestamp           11199
     2                    1          log entry         timestamp           11199
     3                    1          log entry         timestamp           11127
     4                    2          log entry         timestamp           11199
     5                    2          log entry         timestamp           11199

イベント

  event_id  |      name     |   deleted
    1          EVENT_name1       0
    2          Event_name2       0
    3          Event_name3       1

events_people (11199) が後で再参加しました

event_id  |  staff_id    | date_left_event
   1          11199              234234234
   1          11126                 0
   1          11125                 0
   1          11199                 0
   2          11199                 0
   3          11199                 0

スタッフ

staff_id    |    name    |   email
  11125         john         a@b.com
  11126         jane         a@bbasfd.com
4

1 に答える 1

1

あなたのwhere句はleft outer joinsを元に戻しています。一致するものがない場合、2 番目のテーブルの列の値は であり、NULL自動的に比較に失敗します。

解決策は、比較を から に移動するwhereことonです。

FROM `events` AS `event`
     LEFT JOIN `logs` AS `log`
     ON `log`.`event_id` = `event`.`event_id` and
        DATE(FROM_UNIXTIME(`log`.`date_added`)) <= DATE_SUB(CURDATE(), INTERVAL 1 DAY)
     LEFT JOIN `events_people` AS `eventppl`
     ON `event`.`event_id` = `eventppl`.`event_id` and `eventppl`.`date_left_event` = 0
     LEFT JOIN `staff` AS `staff` ON `eventppl`.`staff_id` = `staff`.`staff_id`
WHERE `event`.`deleted` = 0 
GROUP BY `event`.`name`
于 2013-06-28T13:34:43.727 に答える