我想知道这个MySQL查询是否正确? (MySQL很有趣!)

时间:2013-06-28 13:29:47

标签: mysql sql database join relational-database

我想知道这个查询是否正确。我试图选择最近日志条目的人(姓名/电子邮件)(如果该人从未登录过该事件,则为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

1 个答案:

答案 0 :(得分:1)

您的where子句正在撤消left outer join。如果没有匹配项,则第二个表的列中的值为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`