2016-11-04 27 views
1

我在我的手中有一個很大的問題,我有以下SQL結構,其中合同表dinamically產生的,隨機的名字,像_xyz_xxx等:的MySQL得到記錄beetween與條件表

CREATE TABLE contract_xyz(
    id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    created_at DATETIME NOT NULL 
); 
CREATE TABLE contract_events(
    id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    id_contract INT(11) NOT NULL,  
    table_contract VARCHAR(255) NOT NULL, 
    created_at DATETIME NOT NULL 
); 
INSERT INTO contract_xyz (id,created_at) VALUES (1,'2016-11-01'); 
INSERT INTO contract_xyz (id,created_at) VALUES (2,'2016-10-21'); 
INSERT INTO contract_xyz (id,created_at) VALUES (3,'2016-11-04'); 
INSERT INTO contract_events(id,id_contract,table_contract,created_at) VALUES (1,1,'contract_xyz','2016-11-03'); 
INSERT INTO contract_events(id,id_contract,table_contract,created_at) VALUES (2,3,'contract_xyz','2016-11-04'); 

每個合同可以有他自己的事件。我需要解決以下問題:

獲取所有在2天內沒有新事件或根本沒有任何事件的合約,並且是在2天前創建的。

我試過LET JOIN但它不是正確的結果。我得到的最接近的是以下查詢:

SELECT `contract_xyz`.* 
FROM `contract_xyz` 
WHERE EXISTS(SELECT 1 
     FROM `contract_events` 
     WHERE 
      `contract_events`.id_contract = `contract_xyz`.id AND `contract_events`.table_contract = 'contract_xyz' 
      AND DATEDIFF(CURDATE(), `contract_events`.created_at) >= 2 
     ORDER BY `contract_events`.created_at DESC 
     LIMIT 1) 
    OR (NOT EXISTS(SELECT 1 
       FROM `contract_events` 
       WHERE `contract_events`.id_contract = `contract_xyz`.id AND 
         `contract_events`.table_contract = 'contract_xyz') AND 
     DATEDIFF(CURDATE(), `contract_xyz`.created_at) >= 2); 

但我仍然無法找到沒有任何事件的合同,並創造了超過3天前。

回答

1

我會爲每個合約創建一個最大事件日期的子查詢。我會離開這個子查詢的合同表。您可以篩選基礎上,最大的事件日期和創建日期字段,以達到預期的結果:

select c.* 
from contract_xyz c 
left join 
    (select id_contract, 
      max(created_at) max_event_date 
    from contract_events 
    group by id_contract) t on c.id-t.id_contract 
where 
    DATEDIFF(CURDATE(), t.max_event_date) >= 2 
    or (t.max_event_date is null and DATEDIFF(CURDATE(), c.created_at) >= 2) 

或者,您不使用子查詢,但通過與組直接加入2個表並執行濾波條款having

+0

完美!完全合作!我能夠得到所有沒有事件的合同,並且已經有兩天多的時間,所有有事件和最新事件的合同都要超過兩天。謝謝@Shadow – wiLLiamcastrO

0

LEFT OUTER JOINON條件可以幫助在這裏:

select c.id, c.created_at,count(e.id) as contract_events_less_than_2_days_old 
from contract_xyz c 
left outer join contract_events e on e.id_contract = c.id 
           and e.table_contract = 'contract_xyz' 
           and e.created_at > now() - interval 2 day 
where c.created_at < now() - interval 2 day 
and e.id is null 
group by c.id, c.created_at; 

如果你有過任何控制我會建議對動態生成的表名!

相關問題