У меня вопрос похож на предыдущий постер .
Его вопрос звучал так: «Используя только MySQL, я хотел бы выбрать каждую из последних дочерних строк родительских дочерних отношений, гдедочерние строки упорядочены по временной метке ".
Я хотел бы сделать это, однако я также хотел бы выбрать только дочерние строки, где status
равно 1.
Мои таблицы fobs_inventory
и fobs_inventory_history
.Мне нужна самая новая (то есть: самая последняя отметка времени) fobs_inventory_history
запись для каждого fobs_inventory
, где fobs_inventory_history.status = 1
-------------------------------
| fobs_inventory |
-------------------------------
| inv_id | other fields |
-------------------------------
| 1 | ... |
| 2 | ... |
| 3 | ... |
-------------------------------
----------------------------------------------
| fobs_inventory_history |
----------------------------------------------
| id | inv_id | status | created_at |
----------------------------------------------
| 1 | 1 | 0 | 2011-10-11 10:00:00 |
| 2 | 1 | 1 | 2011-08-01 10:00:00 |
| 3 | 1 | 0 | 2011-07-01 10:00:00 |
| 4 | 2 | 1 | 2011-09-11 14:00:00 |
| 5 | 2 | 0 | 2011-08-01 12:00:00 |
| 6 | 2 | 2 | 2011-07-01 00:00:00 |
| 7 | 3 | 1 | 2011-10-11 14:00:00 |
| 8 | 3 | 2 | 2011-08-01 12:00:00 |
| 9 | 3 | 0 | 2011-07-01 00:00:00 |
----------------------------------------------
Какой синтаксис SQL является лучшим для создания набора результатов, который будет выглядеть примерно так:следующая таблица?
--------------------------------------------------------------------
| inv_id | fob_inventory_history_id | status | created_at |
--------------------------------------------------------------------
| 2 | 4 | 1 | 2011-09-11 14:00:00 |
| 3 | 7 | 1 | 2011-10-11 14:00:00 |
--------------------------------------------------------------------
Я хотел бы вернуть только те строки, для которых самая последняя отметка времени имеет status
, равный 1.
edit
Поработав над этим еще немного, я пришел к решению, которое я публикую здесь, поскольку оно может помочь кому-то еще, пытающемуся сделать то же самое.
По сути, решение состояло в том, чтобы выбрать все соответствующие полясвязанные с MAX () и GROUP BY вне вложенного выбора, проверьте его:
select h.id, h.fob_id, h.inv_id, h.status, h.created_at from fobs_inventory_history h, (
select id, inv_id, status, max(created_at) as ts
from fobs_inventory_history
group by inv_id
) h2
where h.created_at = h2.ts
and h.inv_id = h2.inv_id
and h.fob_id = 1 and h.status = 1