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