Как выбрать последнюю дочернюю строку родительских / дочерних отношений, где последняя строка соответствует условию с использованием MySQL - PullRequest
2 голосов
/ 15 сентября 2011

У меня вопрос похож на предыдущий постер .

Его вопрос звучал так: «Используя только 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

Ответы [ 2 ]

1 голос
/ 06 июля 2012

Большое спасибо за публикацию этого !! Это решило проблему, в которой я застрял на два дня. Мне нужно было включить некоторую родительскую информацию, поэтому я добавил JOIN к этому запросу, как показано ниже:

select i.custid, i.custorderno, 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
INNER JOIN invoice AS i ON h2.inv_id = i.inv_id
where h.created_at = h2.ts
and h.inv_id = h2.inv_id 
and h.fob_id = 1 and h.status = 1
0 голосов
/ 15 сентября 2011

Попробуйте

select 
   inv_id, id AS fob_inventory_history_id, status, created_at from  fobs_inventory_history 
where
   status = 1
order by created_at desc
LIMIT 2

Вы можете изменить ограничение в зависимости от того, сколько строк вы хотите получить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...