2016-07-20 7 views
0

私は製品の動きを追跡する製品サンプル在庫システムに取り組んでいます。各製品のステータスは、「IN」または「OUT」または「REMOVED」のステータスを持つことができます。表の各行は、ID、ステータス、および日付が一意である新しいエントリを表します。各製品にはシリアル番号もあります。MySQLデータベース内の複数の同一行から最新のレコードを選択

現在、のすべての商品を返すSQLクエリで助けが必要です。 "OUT" SELECT * FROM table WHERE status = "IN"を選択するだけで、ステータスがINだった製品がすべて返されます。

製品が出入りするたびに、その特定の製品の最後の行を複製し、ステータスを変更して日付を更新すると、自動的に新しいIDが取得されます。ここで

は、私が持っているテーブルです。

id | serial_number | product | color | date  | status 
------------------------------------------------------------ 
1 | K0T4N   | XYZ  | silver | 2016-07-01 | IN 
2 | X56Z7   | ABC  | silver | 2016-07-01 | IN 
3 | 96T4F   | PQR  | silver | 2016-07-01 | IN 
4 | K0T4N   | XYZ  | silver | 2016-07-02 | OUT 
5 | 96T4F   | PQR  | silver | 2016-07-03 | OUT 
6 | F0P22   | DEF  | silver | 2016-07-04 | OUT 
7 | X56Z7   | ABC  | silver | 2016-07-05 | OUT 
8 | F0P22   | DEF  | silver | 2016-07-06 | IN 
9 | K0T4N   | XYZ  | silver | 2016-07-07 | IN 
10 | X56Z7   | ABC  | silver | 2016-07-08 | IN 
11 | X56Z7   | ABC  | silver | 2016-07-09 | REMOVED 
12 | K0T4N   | XYZ  | silver | 2016-07-10 | OUT 
13 | 96T4F   | PQR  | silver | 2016-07-11 | IN 
14 | F0P22   | DEF  | silver | 2016-07-12 | OUT 

答えて

1

このクエリはあなたのクエリ以下は各serial_number

SELECT a.* FROM your_table a 
LEFT JOIN your_table b ON a.serial_number = b.serial_number AND a.id < b.id 
WHERE b.serial_number IS NULL 

のためのすべての最新のレコードを与えるあなたの予想結果に

SELECT a.* FROM your_table a 
LEFT JOIN your_table b ON a.serial_number = b.serial_number AND a.id < b.id 
WHERE b.serial_number IS NULL AND a.status LIKE 'OUT' 
を与えます
+0

任意の成功Bro? –

+0

ありがとう、魅力的なように働いた:) –

+0

それは素晴らしいです。あなたがアップアップして私の答えを受け入れることができますか?) –

1

これを行うには2つの方法があります。パフォーマンスの面でどの方法が最良かは、さまざまな要因に依存する可能性があるため、両方を試してみてください。あなたはあまりにも長い間、その列が表定義でNOT NULL宣言されているとして、問題ではありませんIS NULLためlater_tからチェック欄

SELECT 
t1.* 
FROM table t 
LEFT OUTER JOIN table later_t 
ON later_t.serial_number = t.serial_number 
AND later_t.date > t.date 
WHERE later_t.id IS NULL 
AND t.status = "OUT" 

他の論理的に等価方法は次のとおりです。私は、クエリのこのタイプの私自身の仕事に多く使用

ALTER TABLE table 
ADD INDEX `LatestSerialStatus` (serial_number,date) 

:これらのクエリのそれぞれについて

SELECT 
t.* 
FROM table t 
INNER JOIN (
SELECT 
serial_number, 
MAX(date) AS date 
FROM table 
GROUP BY serial_number 
) latest_t 
ON later_t.serial_number = t.serial_number 
AND latest_t.date = t.date 
WHERE t.status = "OUT" 

、私は強く、以下の指標を提案上記の索引を表の主キーとしてください。このような場合、クエリのパフォーマンスは非常に高速です。

このクエリタイプのdocumentationも参照してください。

+0

解決策ありがとう、それとすべてが今、完璧に動作します –

関連する問題