2013-06-28 41 views
0

我想知道這個查詢是否正確。我試圖選擇最近一次日誌條目(或者如果該人從未登錄過該事件的情況下爲NULL)的人(姓名/電子郵件),則每個人每天發佈的事件數量少於n天。這裏是表約束:我想知道這個MySQL查詢是否正確? (MySQL加入好玩!)

  • 事件具有唯一的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   [email protected] 
    11126   jane   [email protected] 

回答

1

where子句撤消left outer join秒。如果不匹配,第二個表的列中的值爲NULL,這會自動失敗比較。

的解決方案是將比較擺脫whereon

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` 
+0

,這似乎是拉了很多空條目,事情是不正確的。當我試圖限制到一個已知的工作人員的ID,使結果更易於管理你的查詢給我的結果不正確,我的作品(但我不知道它是否適用於所有情況)。要過濾我遵循你的模式,並做了:「左加入'events_people'因爲'eventppl'ON'event'.'event_id' ='eventppl'.'event_id'和'eventppl'.'date_left_event' = 0 AND'eventppl' .'staff_id' = KNOWN_STAFF_ID「 –