假设我有包含以下信息的表格:
库存或不再库存的书籍的库存。
然后,假设还有另一个表指示是否有人拥有这本书的所有权。该表可以显示多个人以前拥有该书,但对于每个出售同一本书的人来说,状态都是“已删除”,表明他们不再拥有该书。如果第四个人当前拥有它,那么它将在表中显示该人的“活跃”状态。
还有一个时间戳,指示每个人何时售出一本书。
这是一些示例数据:
book_inventory表
id | 书籍库存_id | 状态 | 书名 | 返回日期 |
---|---|---|---|---|
1 | 111 | 活跃 | 弗兰肯斯坦 | 2024-08-12 |
2 | 222 | 活跃 | 哈利波特 | 2023-04-15 |
3 | 333 | 活跃 | 指环王 | 2024-08-10 |
4 | 444 | 已删除 | 奥德赛 | 2024-02-01 |
book_ownership表
id | 书籍库存_id | 状态 | 书名 |
---|---|---|---|
1 | 111 | 活跃 | 弗兰肯斯坦 |
2 | 222 | 已删除 | 哈利波特 |
3 | 222 | 已删除 | 哈利波特 |
4 | 222 | 活跃 | 哈利波特 |
5 | 333 | 已删除 | 指环王 |
6 | 333 | 已删除 | 指环王 |
7 | 444 | 已删除 | 奥德赛 |
如您所见,book_ownership 表包含同一 book_inventory_id 值的多个记录,这意味着该值仍保留在库存中,尽管它已经经历了多个所有者,其中 id = '4' 是当前所有者。
问题:如何编写 MySQL 查询来查找当前没有活动所有者但在图书库存中处于活动状态的图书?在上面的示例中,只有“指环王”没有当前所有者并且在图书库存中处于活动状态。
查询
select book_inventory.*
from book_inventory
left join book_ownership
on book_inventory.book_inventory_id = book_ownership.book_inventory_id and book_ownership.status = 'active'
where book.inventory.status = 'active' and book.ownership.id is null
说明:
book_inventory
left join
与book_ownership
一起使用,这样我们的库存和所有权以及不匹配的库存项目之间就会有适当的匹配on
子句中,我们定义了我们所认为的匹配,即 book_inventory_id
值和 status
的所有权
active
where
子句中,我们过滤掉所有匹配的库存项目,因此结果中只留下不匹配的项目status