Получить последнее состояние элемента - PullRequest
0 голосов
/ 19 июля 2010

В MySQL у меня есть две таблицы с отношением 1: n.

У элементов таблицы есть продукты, состояние которых сохраняется в другой таблице, например:

items:

id |ref_num|name    |...
1  |0001   |product1|...
2  |0002   |product2|...

items_states:

id|product_id|state_id|date
1 |1         |5       |2010-05-05 10:25:20
2 |1         |9       |2010-05-08 12:38:00
3 |1         |6       |2010-05-10 20:45:12
...

Таблица состояний не релевантна и связывает только state_id с названием штата и т. Д.

Как получить продукты, где1013 * последний состояние - это то, что я указываю, по одному элементу на строку?

Спасибо

Ответы [ 2 ]

1 голос
/ 19 июля 2010

Возможно, вы захотите попробовать следующее:

SELECT i.ref_num, i.name, s.latest_date
FROM   items i
JOIN   (
           SELECT   product_id, MAX(date) as latest_date
           FROM     items_states
           GROUP BY product_id
       ) s ON (s.product_id = i.id);

Если вы хотите вернуть только один элемент, просто добавьте к запросу WHERE i.id = ?.

Контрольный пример:

CREATE TABLE items (id int, ref_num varchar(10), name varchar(10));
CREATE TABLE items_states (id int, product_id int, state_id int, date datetime);

INSERT INTO items VALUES (1, '0001', 'product1');
INSERT INTO items VALUES (2, '0002', 'product2');

INSERT INTO items_states VALUES (1, 1, 5, '2010-05-05 10:25:20');
INSERT INTO items_states VALUES (2, 1, 9, '2010-05-08 12:38:00');
INSERT INTO items_states VALUES (3, 1, 6, '2010-05-10 20:45:12');

Результат:

+---------+----------+---------------------+
| ref_num | name     | latest_date         |
+---------+----------+---------------------+
| 0001    | product1 | 2010-05-10 20:45:12 |
+---------+----------+---------------------+
1 row in set (0.02 sec)
0 голосов
/ 19 июля 2010

Либо присоединитесь к таблице items_states к себе, для чего требуется second.date> first.date, и добавьте в нее предложение WHERE second.id IS NULL:

SELECT a.* 
FROM item_states a 
LEFT JOIN item_states b
ON a.product_id = b.product_id
AND b.product_id > a.product_id
WHERE b.id IS NULL AND a.state_id = <desired state>

Или выполните запрос на основе строк: см. Mark Byers 'пример.

...