Mysql COUNT, где пользователь НЕ является участником события - PullRequest
1 голос
/ 08 апреля 2020

Я хочу подсчитать все записи в таблице участия для событий, в которых либо нет записи для пользователя, либо если явный пользователь не имеет записи для события.

Пример: у меня 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 ???

Решение должно быть результатом одного счета для всех записей, как это:

enter image description here

Как мне этого добиться?

1 Ответ

1 голос
/ 08 апреля 2020

Подсчитайте несовпадающие строки объединения, чтобы получить количество событий, где 'UserA' равен НЕ участника:

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'
)

См. демонстрационную версию . Результаты:

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