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

3ks5zfa0  于 2021-06-18  发布在  Mysql
关注(0)|答案(5)|浏览(339)

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

  1. SELECT * FROM user_log
  2. WHERE user_id = 123
  3. AND log_comment = "The one I want"
  4. AND NOT log_comment = "The one I don't want"

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

6rvt4ljy

6rvt4ljy1#

您可以使用基于条件聚合函数的筛选 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为“我不想要的”;此查询不会返回任何单行。
将条件聚合与分组依据一起使用:

  1. SELECT u1.*
  2. FROM user_log AS u1
  3. JOIN (SELECT u2.user_id
  4. FROM user_log AS u2
  5. WHERE u2.user_id = 123
  6. GROUP BY u2.user_id
  7. HAVING NOT SUM(u2.log_comment = "The one I don't want")
  8. ) AS dt ON dt.user_id = u1.user_id
  9. WHERE
  10. u1.log_comment = "The one I want"
368yc8dk

368yc8dk2#

我会用 NOT EXISTS :

  1. SELECT ul.*
  2. FROM user_log ul
  3. WHERE NOT EXISTS (SELECT 1
  4. FROM user_log ul1
  5. WHERE ul.user_id = ul1.user_id AND ul1.log_comment = "The one I don't want"
  6. );
swvgeqrz

swvgeqrz3#

我会用 exists 以及 not exists :

  1. select ul.*
  2. from user_log ul
  3. where exists (select 1
  4. from user_log ul2
  5. where ul2.user_id = ul.user_id and
  6. ul2.comment = 'The one I want'
  7. ) and
  8. not exists (select 1
  9. from user_log ul2
  10. where ul2.user_id = ul.user_id and
  11. ul2.comment = 'The one I don''t want'
  12. ) ;
brc7rcf0

brc7rcf04#

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

  1. SELECT * FROM user_log
  2. WHERE user_id = 123
  3. AND log_comment not like "%The one I don't want%"
8ehkhllq

8ehkhllq5#

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

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

相关问题