php - MYSQL查找外键不在相关表中的行

标签 php mysql database

我有可以提前预订的。预订当天即可查看预订的设备。

我有两张 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/

相关文章:

php - 数据在网页上显示两次,但数据库中没有重复项。为什么?

php - MySQL 表和 JSON 解析。是否有外键?

php - 给定行名 (m),在 MySQL 数据库中作为 PHP 查询的一部分,当 (m,n)=x 时查找列名 (n)

python - SQLAlchemy 关系与辅助表连接行为在延迟加载和急切加载之间发生变化

mysql - 如何确保数据库表中只有一行?

PHP:将序列化的blob拉入数组然后显示

php - 不将表单字段保存到数据库

php - 登录在桌面上有效,但在移动设备上无效?

mysql - 在 Rails 应用程序中设置 MySQL

javascript - Node MySQL - 可重用连接模块