复合where过滤mysql查询

问题描述 投票:0回答:1

我有一张表格

用户 ID 活动
1 ev1 3
1 ev3 6
2 ev1 2
2 ev2 1
2 ev3 10
3 ev4 4

我正在尝试查看是否有一种方法可以在单次查询中应用复杂的 AND 和 OR 过滤器来计算有多少 user_id 满足条件。

复合过滤器的示例如下(仅使用 OR 和 AND):

  • AND(OR(ev1 > 1, ev2 > 0), (ev3 > 5))

这意味着我想计算有多少用户拥有这些事件计数,运行此条件应该会产生 2 个用户:user_id=1 & user_id=2

我尝试按照以下方式将其写为 WHERE 子句:

SELECT count(user_id) from table
WHERE (
  (
   (event = 'ev1' AND count > 1)
   OR
   (event = 'ev2' AND count > 0)
  )
  AND
  (
   (event = 'ev3' AND count > 5)
  )
)

我不知道如何正确编写 AND 部分,因为每当您包含 AND 检查时它都会返回 0 行,但是仅使用 OR 检查它就可以正确工作

sql mysql boolean
1个回答
0
投票

听起来您需要一个带有条件计数的

HAVING
,而不是
WHERE
,并且您需要对其进行子查询,以便在计算剩余的总不同
user_id
之前可以按
user_id
执行此操作。

SELECT
  COUNT(*)
FROM (
    SELECT
      t.user_id
    FROM YourTable t
    GROUP BY
      t.user_id
    HAVING COUNT(CASE WHEN
        t.event = 'ev1' AND t.count > 1
        OR
        t.event = 'ev2' AND t.count > 0
      THEN 1 END) > 0
    )
    AND
    (
      COUNT(CASE WHEN t.event = 'ev3' AND t.count > 5 THEN 1 END) > 0
    )
) t;

想法是:

COUNT(CASE WHEN someCondition THEN 1 END) > 0
告诉您组中是否有任何行匹配该条件。因此,您可以在
HAVING
中组合多个计数来组成任意表达式。

© www.soinside.com 2019 - 2024. All rights reserved.