mysql如何基于避免特定结果过滤查询

9lowa7mx  于 2021-06-18  发布在  Mysql
关注(0)|答案(5)|浏览(346)

以下是简化的等效值:
表:用户日志
字段:log\u id、user\u id、log\u comment、log\u created、log\u updated
我尝试的是:

SELECT * FROM user_log 
    WHERE user_id = 123 
    AND log_comment = "The one I want"
    AND NOT log_comment = "The one I don't want"

期望的结果:理想情况下,我希望它返回表中该用户id的所有记录,如果它包含“我不想要的那个”的注解,则完全不返回任何记录。
实际结果:不起作用。它所做的是返回带有注解“我想要的那个”的记录。
抱歉,如果标题不清楚,我不知道如何描述我的问题。

bd1hkmkf

bd1hkmkf1#

SELECT * FROM user_log 
WHERE user_id = 123 
AND log_comment     LIKE "%The one I want%"
AND log_comment NOT LIKE "%The one I don't want%"

当我读到你的描述时,这里有一些 log_comment “嘿,我想要的那个——是的!”—抓住这个
“嘿,我想要的那个——是的,我想要的那个”——抓住这个
“嘿,我不想要的那个——是的!”—跳过这个
“嘿,我想要的那个。哦,等等,我不想要的那个”--跳过这个
“我不想要的那个哦,等等——我想要的那个”——也跳过了
如果这些不是正确的结果,那么用一组例子来澄清你的问题。

yfjy0ee7

yfjy0ee72#

您可以使用基于条件聚合函数的筛选 Group By 以及 Having 条款。在派生表中,我们可以确定 user_id = 123 和你有什么争执吗 log_comment = "The one I don't want" . HAVING NOT SUM(log_comment = "The one I don't want") 确保用户id不存在这样的行。
现在,只需将这个派生表结果集连接到 user_log 表,只获取 log_comment = "The one I want" .
如果有一行用户id为“我不想要的”;此查询不会返回任何单行。
将条件聚合与分组依据一起使用:

SELECT u1.* 
FROM user_log AS u1 
JOIN (SELECT u2.user_id 
      FROM user_log AS u2 
      WHERE u2.user_id = 123 
      GROUP BY u2.user_id 
      HAVING NOT SUM(u2.log_comment = "The one I don't want")
     ) AS dt ON dt.user_id = u1.user_id 
WHERE 
  u1.log_comment = "The one I want"
9w11ddsr

9w11ddsr3#

我会用 exists 以及 not exists :

select ul.*
from user_log ul
where exists (select 1
              from user_log ul2
              where ul2.user_id = ul.user_id and
                    ul2.comment = 'The one I want'
             ) and
      not exists (select 1
                  from user_log ul2
                  where ul2.user_id = ul.user_id and
                        ul2.comment = 'The one I don''t want'
                 ) ;
nbewdwxp

nbewdwxp4#

我会用 NOT EXISTS :

SELECT ul.*
FROM user_log ul
WHERE NOT EXISTS (SELECT 1 
                  FROM user_log ul1 
                  WHERE ul.user_id = ul1.user_id AND ul1.log_comment = "The one I don't want"
                 );
suzh9iv8

suzh9iv85#

我不确定我是否理解这个问题,但这是否有效:

SELECT * FROM user_log 
WHERE user_id = 123 
AND log_comment not like "%The one I don't want%"

相关问题