我有 2 张桌子 - 预订:
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 在这里不起作用。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
为了完整起见(我真的相信它更适合),我鼓励您使用简单的
NOT EXISTS。SELECT * FROM reservation R WHERE NOT EXISTS ( SELECT 1 FROM reservation_log WHERE reservation_id = R.id AND change_type = 'cancel' );SELECT * FROM reservation WHERE id NOT IN (select reservation_id FROM reservation_log WHERE change_type = 'cancel')或者:
第一个版本更直观,但我认为第二个版本通常会获得更好的性能(假设您在联接中使用的列上有索引)。
第二个版本有效,因为 LEFT JOIN 为第一个表中的所有行返回一行。当
ON条件成功时,这些行将包含第二个表中的列,就像INNER JOIN一样。当条件失败时,返回的行将包含第二个表中所有列的NULL。然后,WHERE l.id IS NULL测试会匹配这些行,因此它会找到表之间不匹配的所有行。