0

我想知道这个查询是否正确。我正在尝试为每个人在少于 n 天前发布的每个事件中选择最近的日志条目(如果该人从未记录该事件,则为 NULL)的人(姓名/电子邮件)。以下是表约束:

  • 一个事件有一个唯一的 ID,但它可以有多个日志条目。
  • 一个事件可以有多个工作人员。
  • 可以将一名工作人员分配给多个事件。
  • 工作人员只会记录他/她参与的事件。
  • 如果工作人员是事件的一部分,则“0”将出现在 date_dropped_event 字段中。如果工作人员退出事件,这将更改为非零时间戳。如果工作人员稍后重新加入该事件,则将创建一个带有“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。当没有匹配时,第二个表的列中的值为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 回答