我有可以提前预订的。预订当天即可查看预订的设备。
我有两张 table ,预订 table 和结帐 table 。预订有很多结账。
我如何构建一个查询来返回特定日期的所有预订,但没有关联的结账记录?
换句话说,预订中的所有行中reservation_id 列不包含预订的ID?
到目前为止,我最好的猜测是
SELECT * FROM reservations WHERE reservations.id NOT IN (SELECT reservation_id
FROM checkouts)
但是返回空。这是表格的粗略想法
|reservations| |checkouts |
|id = 1 | |reservation_id = 1|
|id = 2 | |reservation_id = 2|
|id = 3 |
我的结果应该是保留 3。
附注如果需要 php,那没问题。
最佳答案
查询不返回任何行的最可能的解释是,checkouts
中有些行的reservation_id 值为 NULL。考虑:
4 NOT IN (2,3,5,NULL,11)
在解释这一点时,NULL 值被视为意味着“未知该值是什么”。 4 在该列表中吗?答案(从 SQL 返回)基本上是“未知”4 是否与列表中的“未知”值匹配。
如果这就是导致该行为的原因,您可以通过在子查询中包含 WHERE booking IS NOT NULL
来“修复”当前查询。
SELECT r.*
FROM reservations r
WHERE r.id NOT IN ( SELECT c.reservation_id
FROM checkouts c
WHERE c.reservation_id IS NOT NULL
)
这可能不是返回指定结果的最有效方法。反连接是返回此类结果的常见模式。在您的情况下,这将是一个外连接,返回来自 reservations
的所有行,以及来自 checkouts
的匹配行,然后在 WHERE 子句中使用谓词来过滤掉匹配的所有行,留下 reservations
中不匹配的行。
例如:
SELECT r.*
FROM reservations r
LEFT
JOIN checkouts c
ON c.reservation_id = r.reservation_id
WHERE c.reservation_id IS NULL
还可以通过带有相关子查询的 NOT EXISTS
获得等效结果。
SELECT r.*
FROM reservations r
WHERE NOT EXISTS ( SELECT 1
FROM checkouts c
WHERE c.reservation_id = r.reservation_id
)
关于php - MYSQL查找外键不在相关表中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26045943/