2016-07-07 58 views
0

我已經閱讀了很多與這個問題非常類似的問題和答案,主要問題是他們使用LIMIT作爲解決方案來返回最新的記錄,噸與這個查詢工作,因爲我需要幾個結果回來。MYSQL - 返回GROUP BY前的最近記錄

邏輯如下爲:

  • 每個記錄具有effective_date,當記錄值生效。
  • 只有拉回來的記錄誰是effective_date的是今天或已通過
  • 我拉回來的記錄,給我基礎上,最近的記錄「date_entered」該記錄

到目前爲止通過此查詢,我能夠完成除了最後一點邏輯之外的所有內容。我不能在GROUP BY之後使用ORDER BY,因爲結果已經被分組,因此我無法使用MAX()日期。我需要做WHERE聲明中的邏輯。

SELECT 
    aos_products.`name`, 
    cac_customize_agent_comp_cstm.commission_percentage_c, 
    cac_customize_agent_comp.date_entered 
FROM 
    wn_writing_number 
LEFT OUTER JOIN wn_writing_number_cac_customize_agent_comp_1_c ON wn_writing_number.id = wn_writing_number_cac_customize_agent_comp_1_c.wn_writing946b_number_ida 
LEFT OUTER JOIN cac_customize_agent_comp_cstm ON wn_writing_number_cac_customize_agent_comp_1_c.wn_writing3148nt_comp_idb = cac_customize_agent_comp_cstm.id_c 
LEFT OUTER JOIN cac_customize_agent_comp ON cac_customize_agent_comp_cstm.id_c = cac_customize_agent_comp.id 
LEFT OUTER JOIN aos_products_cac_customize_agent_comp_1_c ON cac_customize_agent_comp_cstm.id_c = aos_products_cac_customize_agent_comp_1_c.aos_produca2b8nt_comp_idb 
LEFT OUTER JOIN aos_products ON aos_products_cac_customize_agent_comp_1_c.aos_products_cac_customize_agent_comp_1aos_products_ida = aos_products.id 
WHERE 
    wn_writing_number.id = 'b556d816-f2e6-b78f-c776-576c0542585c' 
AND wn_writing_number_cac_customize_agent_comp_1_c.deleted = '0' 
AND cac_customize_agent_comp_cstm.effective_date_c <= CURDATE() 
GROUP BY aos_products.`name` 

沒有GROUP BY,則返回:

+---------+-------------------------+----------------------+ 
    | name | commission_percentage_c |  date_entered  | 
    +---------+-------------------------+----------------------+ 
    | Val 2 | 14.75     | 2016-07-07 15:04:02 | 
    +---------+-------------------------+----------------------+ 
    | Val 1 | 16      | 2016-07-07 00:31:08 | 
    +---------+-------------------------+----------------------+ 

 (varchar)  (varchar)     (datetime) 
    +---------+-------------------------+----------------------+ 
    | name | commission_percentage_c |  date_entered  | 
    +---------+-------------------------+----------------------+ 
    | Val 1 | 15.25     | 2016-07-06 23:57:28 | 
    +---------+-------------------------+----------------------+ 
    | Val 1 | 15.75     | 2016-07-07 00:03:03 | 
    +---------+-------------------------+----------------------+ 
    | Val 1 | 16      | 2016-07-07 00:31:08 | 
    +---------+-------------------------+----------------------+ 
    | Val 2 | 14.75     | 2016-07-07 15:04:02 | 
    +---------+-------------------------+----------------------+ 
與返回

+---------+-------------------------+----------------------+ 
    | name | commission_percentage_c |  date_entered  | 
    +---------+-------------------------+----------------------+ 
    | Val 2 | 14.75     | 2016-07-07 15:04:02 | 
    +---------+-------------------------+----------------------+ 
    | Val 1 | 15.25     | 2016-07-06 23:57:28 | 
    +---------+-------------------------+----------------------+ 

我試圖找回是集團

因爲我需要最新的VAL 1記錄d回來,像使用

WHERE the datediff BETWEEN NOW() and date_entered = the smallest amount of time compared with other records 
+0

使用'max()'爲date_entered – CSK

+1

[檢索每個組中的最後一條記錄]的可能重複(http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group ) – imtheman

回答

2

試試這個

SELECT * 
FROM 
    (SELECT 
     aos_products.`name` as name, 
     cac_customize_agent_comp_cstm.commission_percentage_c as commission_percentage_c, 
     cac_customize_agent_comp.date_entered as date_entered 
    FROM 
     wn_writing_number 
    LEFT OUTER JOIN wn_writing_number_cac_customize_agent_comp_1_c ON wn_writing_number.id = wn_writing_number_cac_customize_agent_comp_1_c.wn_writing946b_number_ida 
    LEFT OUTER JOIN cac_customize_agent_comp_cstm ON wn_writing_number_cac_customize_agent_comp_1_c.wn_writing3148nt_comp_idb = cac_customize_agent_comp_cstm.id_c 
    LEFT OUTER JOIN cac_customize_agent_comp ON cac_customize_agent_comp_cstm.id_c = cac_customize_agent_comp.id 
    LEFT OUTER JOIN aos_products_cac_customize_agent_comp_1_c ON cac_customize_agent_comp_cstm.id_c = aos_products_cac_customize_agent_comp_1_c.aos_produca2b8nt_comp_idb 
    LEFT OUTER JOIN aos_products ON aos_products_cac_customize_agent_comp_1_c.aos_products_cac_customize_agent_comp_1aos_products_ida = aos_products.id 
    WHERE 
     wn_writing_number.id = 'b556d816-f2e6-b78f-c776-576c0542585c' 
    AND wn_writing_number_cac_customize_agent_comp_1_c.deleted = '0' 
    AND cac_customize_agent_comp_cstm.effective_date_c <= CURDATE() 
    ORDER BY cac_customize_agent_comp.date_entered DESC) t 
GROUP BY t.name 

的這個想法是使用group by前,向date_entered記錄進行排序。從this postgroupby將使用挑選第一個在正常的SELECT相同的順序。

+0

這工作!非常感謝!我一定會保留這個答案書籤爲將來使用。 –

0

max()爲最新的日期時間

SELECT 
aos_products.`name`, 
cac_customize_agent_comp_cstm.commission_percentage_c, 
max(cac_customize_agent_comp.date_entered) as date_entered  
FROM 
    wn_writing_number 
LEFT OUTER JOIN wn_writing_number_cac_customize_agent_comp_1_c ON  wn_writing_number.id = wn_writing_number_cac_customize_agent_comp_1_c.wn_writing946b_number_ida 
LEFT OUTER JOIN cac_customize_agent_comp_cstm ON wn_writing_number_cac_customize_agent_comp_1_c.wn_writing3148nt_comp_idb = cac_customize_agent_comp_cstm.id_c 
LEFT OUTER JOIN cac_customize_agent_comp ON cac_customize_agent_comp_cstm.id_c = cac_customize_agent_comp.id 
LEFT OUTER JOIN aos_products_cac_customize_agent_comp_1_c ON cac_customize_agent_comp_cstm.id_c = aos_products_cac_customize_agent_comp_1_c.aos_produca2b8nt_comp_idb 
LEFT OUTER JOIN aos_products ON aos_products_cac_customize_agent_comp_1_c.aos_products_cac_customize_agent_comp_1aos_products_ida = aos_products.id 
WHERE 
    wn_writing_number.id = 'b556d816-f2e6-b78f-c776-576c0542585c' 
AND wn_writing_number_cac_customize_agent_comp_1_c.deleted = '0' 
AND cac_customize_agent_comp_cstm.effective_date_c <= CURDATE() 
GROUP BY aos_products.`name` 
+0

這將返回最近的date_entered列,但其他2列保持不變。換句話說,它與數據不匹配。我相信這是因爲列在不同的表中,但我可能是錯的 –