我有一个 (MySQL) 数据库表,其中包含公司租赁或销售的零件的历史记录。该表可能包含以下数据:
表:库存
id|type|serial
--------------
1|recv| 1234
2|recv| 2345
3|recv| 3456
4|leas| 2345
5|sold| 1234
6|ret | 2345
在上面的示例中,我们收到(存入)了序列号为 1234、2345、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、3456 与接收/库存历史相关联(inventory_history 中的第 1 行)。项目 2345 (inventory_serials) 与第 2 行 (inventory_history) 等相关。
最佳答案
以下查询为每个项目选择最新的 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 .
关于php - 从数据库中获取唯一和未使用的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23137166/