我有一个(MySQL)数据库表,其中包含公司租赁或销售的部件的历史记录。该表可能包含以下数据:
表:库存
id|type|serial
--------------
1|recv| 1234
2|recv| 2345
3|recv| 3456
4|leas| 2345
5|sold| 1234
6|ret | 2345
在上面的示例中,我们收到(库存)库存中的三个项目,序列号为1234,2345,3 3456。项目2345已租赁然后返回,而项目1234已售出。我需要的是能够看到目前可供出租或出售的物品。
在这个例子中,我应该从SQL查询中返回2345和3456,因为从未触及过3456并且租用了2345,但是返回了(将其放回库存中)。我不确定我是否需要在我的SQL查询中使用'DISTINCT'或者是什么。
更新:抱歉,我对数据库布局误导了。这是实际的设置:
表:inventory_history
id|date|action
--------------
1|....| recv
2|....| leas
3|....| sold
4|....| ret
表:inventory_serials
id|fk|serial
--------------
1| 1| 1234
2| 1| 2345
3| 1| 3456
4| 2| 2345
5| 3| 1234
6| 4| 2345
设置的表格,以便可以存在一个历史列表(例如,已接收/存储),其中多个序列号被分配给该一个实例。因此,在该示例中,项目1234,2345,335与接收/存储的历史(inventory_history中的第1行)相关联。项目2345(inventory_serials)与第2行(inventory_history)等相关。
答案 0 :(得分:4)
以下查询为每个项目选择最新的id
,然后检查该id
条记录是recv
还是leas
还是ret
类型,表明item的可用性。
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。