从数据库中获取唯一且未使用的项目

时间:2014-04-17 15:26:24

标签: php mysql sql

我有一个(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)等相关。

1 个答案:

答案 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