【问题标题】:I'm wondering if this MySQL query is correct? (MySQL joining fun!)我想知道这个 MySQL 查询是否正确? (MySQL 加入乐趣!)
【发布时间】:2013-06-28 13:29:47
【问题描述】:

我想知道这个查询是否正确。我正在尝试为每个人在少于 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

【问题讨论】:

    标签: mysql sql database join relational-database


    【解决方案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`
    

    【讨论】:

    • 这似乎是拉了很多 NULL 条目和不正确的东西。当我尝试限制为已知的员工 ID 以使结果更易于管理时,您的查询给了我不正确的结果,我的工作(但我不确定它是否适用于所有情况)。为了过滤,我按照你的模式做了:“ LEFT JOIN events_people AS eventppl ON event.event_id = eventppl.event_ideventppl.date_left_event = 0 AND eventpplstaff_id = KNOWN_STAFF_ID"
    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2023-03-18
    • 2011-08-21
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    相关资源
    最近更新 更多