2013-09-16 3 views
4

Я строю систему учета запасов и решил сохранить баланс (каждый раз он обновляется) каждого продукта в следующей таблице:MySQL Выберите один ряд с уникальным значением атрибута

+------------+--------------+---------+------+ 
| Product_id | Warehouse_id | Balance | Date | 
+------------+--------------+---------+------+ 

Пример:

персонала добавляет 10 штук в pRODUCT_ID 123 в warehouse_id 5

+------------+--------------+---------+-------------+ 
| Product_id | Warehouse_id | Balance | Date  | 
+------------+--------------+---------+-------------+ 
| 123  | 5   | 10  | 2013-09-16 | 
+------------+--------------+---------+-------------+ 

персонал затем добавляет 3 части к продукту 234 в warehouse_id 5 и 5 штук до 123 в warehouse_id 5,

+------------+--------------+---------+-------------+ 
| Product_id | Warehouse_id | Balance | Date  | 
+------------+--------------+---------+-------------+ 
| 123  | 5   | 10  | 2013-09-16 | 
| 234  | 5   | 3  | 2013-09-18 | 
| 123  | 5   | 15  | 2013-09-21 | 
+------------+--------------+---------+-------------+ 

* Обратите внимание на столбец даты

Теперь позвольте мне добавить несколько строк

+------------+--------------+---------+-------------+ 
| Product_id | Warehouse_id | Balance | Date  | 
+------------+--------------+---------+-------------+ 
| 123  | 5   | 10  | 2013-09-16 | 
| 234  | 5   | 3  | 2013-09-18 | 
| 123  | 5   | 15  | 2013-09-21 | 
| 123  | 5   | 18  | 2013-09-24 | 
| 234  | 5   | 10  | 2013-09-26 | 
| 123  | 5   | 22  | 2013-09-29 | 
+------------+--------------+---------+-------------+ 

Как я выполнить запрос, который получил бы мне все продукты балансов по состоянию на 25 сентября 2013 года?

Это означает, что мне нужно следующий результат:

+------------+--------------+---------+-------------+ 
| Product_id | Warehouse_id | Balance | Date  | 
+------------+--------------+---------+-------------+ 
| 234  | 5   | 3  | 2013-09-18 | 
| 123  | 5   | 18  | 2013-09-24 | 
+------------+--------------+---------+-------------+ 

Короче мне нужна последняя строка (по дате), за product_id.

Любая помощь была бы принята с благодарностью!

ответ

2

Если предположить, что остатки продукты в настоящее время поддерживается на складе вы можете сделать это, как этот

SELECT t.product_id, t.warehouse_id, t.balance, t.date 
    FROM table1 t JOIN 
(
    SELECT warehouse_id, product_id, MAX(date) date 
    FROM table1 
    WHERE date <= '2013-09-25' 
    GROUP BY warehouse_id, product_id 
) q 
    ON t.warehouse_id = q.warehouse_id 
    AND t.product_id = q.product_id 
    AND t.date = q.date 

Выход:

 
| PRODUCT_ID | WAREHOUSE_ID | BALANCE |  DATE | 
|------------|--------------|---------|------------| 
|  234 |   5 |  3 | 2013-09-18 | 
|  123 |   5 |  18 | 2013-09-24 | 

Здесь SQLFiddle демо

+0

почему вам нужно упомянуть warehouse_id? – Bere

+1

@Bere Может потребоваться или не понадобиться в зависимости от того, как сохраняются остатки. ОП неясен в вопросе по этому вопросу. Но кажется, что и логично, что они хранятся на складе. – peterm

+0

@peterm, ничего себе, я совсем забыл об упоминании, что может быть несколько складов! Спасибо что подметил это. Запрос выглядит неплохо, плохо проверить его на работе! –

0
SELECT * 
FROM TABLE 
WHERE (PRODUCT_ID, DATE) IN 
    (SELECT PRODUCT_ID, MAX(DATE) FROM TABLE 
     WHERE DATE <= '2013-09-25'  
     GROUP BY PRODUCT_ID) 
0

Запрос :

SQLFIDDLEExample

SELECT * 
    FROM table1 t 
    WHERE t.`Date` = (SELECT MAX(t2.`Date`) 
        FROM Table1 t2 
        WHERE t2.`Date` <= '2013-09-25' 
        AND t2.product_id = t.product_id) 
+0

http://sqlfiddle.com/#!2/fc645/1 Привет, Джастин ..в этом случае он даст два результата для одного продукта. Поэтому я думаю, вы должны добавить предложение group by –

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