8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

仅当值不存在时才返回行

s_baldur 2月前

86 0

我有 2 个表 - reservation:id | some_other_column ----+------------------ 1 | value 2 | value 3 | value 第二个表 - reservation_log:id | reservation_id |

我有两张桌子- reservation

   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 在这里不起作用。

帖子版权声明 1、本帖标题:仅当值不存在时才返回行
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由s_baldur在本站《mysql》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 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 然后测试匹配这些行,因此它会找到表之间没有匹配项的所有行。

  • Basu 2月前 0 只看Ta
    引用 3

    @Barmar 好吧,既然你似乎想让我就这个问题而不是我自己寻求帮助......当从子查询调用多个列时,我该怎么做,同时记住内连接需要一个匹配的列,它将始终删除不匹配的结果,这在我的处境下是行不通的,因为我需要两列都包含用户名。

  • @Bruce 您可以在加入时使用 ON t1.username in (t2.blocker, t2.blocked) 来匹配任一列。

  • 我不需要匹配任何一个,我需要匹配两者。如果我匹配一个,它不会返回另一个的结果。

  • 然后使用 ON t1.username = t2.blocker AND t1.username = t2.blocked 来匹配两者。这是基本的 SQL。

  • @Bruce 尝试理解它的逻辑,而不是仅仅复制代码。如果你理解它的工作原理,你将能够推广到许多不同的情况。

  • 只是为了完整性(我真的相信它更合适),我鼓励你使用一个简单的 NOT EXISTS .

    SELECT * FROM reservation R
    WHERE NOT EXISTS (
      SELECT 1 FROM reservation_log
      WHERE reservation_id = R.id
        AND change_type = 'cancel'
    );
    
返回
作者最近主题: