我有一个(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记录是否具有recvleasret类型,以指示项目的可用性。

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

10-08 06:53