mysql - 仅当值不存在时返回行

标签 mysql sql

我有 2 张 table - 预订:

   id  | some_other_column
   ----+------------------
   1   | value
   2   | value
   3   | value

第二个表 - reservation_log:

   id  | reservation_id | change_type
   ----+----------------+-------------
   1   | 1              | create
   2   | 2              | create
   3   | 3              | create
   4   | 1              | cancel
   5   | 2              | cancel

我只需要选择未取消的预订(本例中仅为 ID 3)。 我可以使用简单的 WHERE change_type = cancel 条件轻松选择“取消”,但我很难选择“不取消”,因为简单的 WHERE 在这里不起作用。

最佳答案

SELECT *
FROM reservation
WHERE id NOT IN (select reservation_id
                 FROM reservation_log
                 WHERE change_type = 'cancel')

或者:

SELECT r.*
FROM reservation r
LEFT JOIN reservation_log l ON r.id = l.reservation_id AND l.change_type = 'cancel'
WHERE l.id IS NULL

第一个版本更直观,但我认为第二个版本通常会获得更好的性能(假设您在联接中使用的列上有索引)。

第二个版本有效,因为 LEFT JOIN 为第一个表中的所有行返回一行。当 ON 条件成功时,这些行将包含第二个表中的列,就像 INNER JOIN 一样。当条件失败时,返回的行将包含第二个表中所有列的 NULL。然后,WHERE l.id IS NULL 测试会匹配这些行,因此它会找到表之间不匹配的所有行。

关于mysql - 仅当值不存在时返回行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47442895/

相关文章:

import - mysql:设置插入的列默认值

php - 在 mysql 数据库上使用另一个就地编辑器 Jquery 插件

sql - SQL 服务器新手,想要安排表/数据每 X 小时移动一次

mysql - 查询从具有公共(public)列数据的多行中检索最后一条记录

sql 使用 "less than or equal to"& "not greater than"

java - 不同字符串连接到 mysql 的应用程序属性

php - 无法在数据库中更新和/或插入图像(显示它也有问题)

sql - 将时间戳格式化为 1/100 秒/1/10 秒

mysql - 一个有点棘手的mysql查询

mysql - 只获取今天的帖子?