【问题标题】:Mysql COUNT where user is NOT event participantMysql COUNT 用户不是事件参与者
【发布时间】:2020-04-08 10:08:50
【问题描述】:

我想计算参与表中的所有条目,以查找没有用户条目或显式用户没有事件条目的事件。

示例:我有 13 个事件和 2 个用户。

用户 A(即我用于查询的用户)参与了两个事件(事件 1 和事件 2)。 用户 B 还参加了两个活动(活动 2 和活动 3)。 没有人参加过其他任何活动。

如果我使用 WHERE event.userId = "User A" 查询,我得到正确的计数 2

如果我查询 WHERE event.userId IS NULL 我得到正确的计数 10

但是如果我查询 WHERE event.userId IS NULL OR event.userId != "User A" 我得到的计数是 13(但应该是 11)

SELECT 
    COUNT(DISTINCT event.id) AS count
FROM 
    event 
LEFT JOIN 
    event_participation participation ON participation.eventId=event.id

###    
# WITH USER    
###

# With this where clause I will get the correct count with the user
#WHERE participation.userId = "de9d0de5-5b2f-4108-8df7-6b89ec539679"            

###    
# WITHOUT USER
###

# Tried participation.userId != "de9d0de5-5b2f-4108-8df7-6b89ec539679" for ??? after OR, but this is not correct
#WHERE participation.userId IS NULL OR ???

解决方案应该是所有条目的单一计数结果:

我怎样才能做到这一点?

【问题讨论】:

  • 您当前的查询有什么问题?它应该已经开始工作了。
  • 请在您的问题中添加示例数据。
  • 好的,我将它添加到问题中
  • 不...我的意思是为有问题的表添加示例表数据,然后向我们展示预期的输出。不要留下任何可能引起误解的细节。
  • WHERE event.userId IS NULL OR event.userId != "User A"是什么意思?为什么结果应该是 11?

标签: mysql sql join count relation


【解决方案1】:

计算连接的不匹配行,以获取'UserA'NOT参与者的事件数:

SELECT COUNT(DISTINCT e.id) AS count
FROM event e LEFT JOIN  event_participation p 
ON p.eventId = e.id AND p.userId = 'UserA'
WHERE p.eventId IS NULL

或者因为id是表event的主键:

SELECT COUNT(*) AS count
FROM event e LEFT JOIN  event_participation p 
ON p.eventId = e.id AND p.userId = 'UserA'
WHERE p.eventId IS NULL

NOT EXISTS:

SELECT COUNT(*) AS count
FROM event e 
WHERE NOT EXISTS (
  SELECT 1 FROM event_participation p 
  WHERE p.eventId = e.id AND p.userId = 'UserA'
)

请参阅demo
结果:

> | count |
> | ----: |
> |    11 |

【讨论】:

  • 谢谢!第二个解决方案对我很有效
  • 你能解释一下它为什么起作用吗?我不确定您为什么将应该从结果中排除的用户添加到联接中,以及为什么它以这种方式工作。
  • 此条件:ON p.eventId = e.id AND p.userId = 'UserA' 连接当前事件和特定用户的行匹配的表。然后条件:WHERE p.eventId IS NULL 过滤掉所有这些匹配的行。结果是所有不匹配的行,这就是你想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2016-04-04
  • 2010-12-14
  • 2019-03-05
相关资源
最近更新 更多