Я прочитал много вопросов и ответов по очень похожим вопросам, так как эта проблема и основная проблема заключается в том, что они используют 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
с использованием 'max()' для date_entered – CSK
Возможный дубликат [Получение последней записи в каждой группе] (http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group) – imtheman