2016-07-07 4 views
0

Я прочитал много вопросов и ответов по очень похожим вопросам, так как эта проблема и основная проблема заключается в том, что они используют LIMIT в качестве решения для возврата самой последней записи, t работать с этим запросом, потому что мне нужно несколько результатов назад.MYSQL - верните самую последнюю запись перед GROUP BY

Logic следующим образом:

  • Каждая запись имеет effective_date, когда значение записи вступает в силу.
  • только тянуть обратно записи Кто на effective_date «s сегодня или уже прошло
  • Из записей я тянуть назад, дайте мне самую последнюю запись, основанную на» date_entered "для этой записи

До сих пор С этим запросом я смог выполнить все, кроме последней бит логики. Я не могу использовать ORDER BY после GROUP 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, то она возвращает:

 (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 | 
    +---------+-------------------------+----------------------+ 

С GROUP BY она возвращает

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

То, что я пытаюсь получить обратно есть:

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

Потому что мне нужен последний VAL 1 recor 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 

Идея этого отсортировать записи по date_enteredперед тем использованием group by. С this post, groupby будет использовать первый в том же порядке, что и обычный SELECT.

+0

Это сработало! Спасибо! Я обязательно сохраню этот ответ в закладки для будущего использования. –

0

использованием max() для последнего DateTime

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 столбца остаются неизменными. Другими словами, он не соответствует данным. Я считаю, что это потому, что столбцы находятся в разных таблицах, но я мог ошибаться –

Смежные вопросы