我有一个(mysql)数据库表,其中包含公司租赁或销售的部件的历史记录。该表可能包含以下数据:
表:库存
id|type|serial
--------------
1|recv| 1234
2|recv| 2345
3|recv| 3456
4|leas| 2345
5|sold| 1234
6|ret | 2345
在上面的例子中,我们收到(库存)了三件序列号为123423456的物品。2345号物品出租后归还,1234号物品出售。我需要的是能够看到哪些项目目前可以出租或出售。
在这个例子中,我应该从一个sql查询中返回2345和3456,因为3456从未被触及,2345被租用,但被返回(放回库存)。我不确定是否需要在sql查询中使用“distinct”或什么。
更新:抱歉,数据库布局有误。以下是实际设置:
表:库存历史记录
id|date|action
--------------
1|....| recv
2|....| leas
3|....| sold
4|....| ret
表:库存序列
id|fk|serial
--------------
1| 1| 1234
2| 1| 2345
3| 1| 3456
4| 2| 2345
5| 3| 1234
6| 4| 2345
在其中设置的表,以便可以有一个历史记录列表(例如接收/储存),其中多个序列号被分配给该实例。因此在本例中,项目1234、2345、3456与接收/库存历史记录(库存历史记录中的第1行)相关联。2345项(库存序列)与第2行(库存历史)等相关。
最佳答案
下面的查询为每个项目选择最新的id
,然后检查该id
记录是否具有recv
或leas
或ret
类型,以指示项目的可用性。
SELECT
inventory.*
FROM inventory
INNER JOIN
(SELECT serial, max(id) id
FROM inventory
GROUP BY serial) max_id
ON inventory.id = max_id.id
WHERE type in ('recv', 'leas', 'ret');
编辑:
根据修改后的表结构,可以使用以下查询:
SELECT
iss.*
FROM inventory_serials iss
INNER JOIN
(SELECT serial, max(id) id
FROM inventory_serials
GROUP BY serial) max_id
ON iss.id = max_id.id
INNER JOIN inventory_history ih
ON iss.fk = ih.id
WHERE ih.action in ('recv', 'leas', 'ret');
这是SQL Fiddle。