Получение количества из вложенного оператора выбора - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть следующий запрос, который работает точно так, как задумано (спасибо полезным людям в stackoverflow).Однако я понял, что в дополнение к использованию счетчика для проверки того, является ли сообщение <= 3, я также хочу получить фактическое число / количество для каждой строки, которая возвращается в результатах.</p>

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

Я пробовал несколько разных вариантов, но это не совсем работает.

SELECT u.*
FROM users u
WHERE 
 NOT EXISTS (
    SELECT 1 
    FROM events e 
    WHERE e.user_id = u.id AND e.type = 'collection'
 )
 AND (
    SELECT COUNT(*) 
    FROM messages m 
    WHERE m.user_id = u.id AND m.message_type = 'collection_reminder'
 ) <= 3
AND u.admin IS NULL

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Переместить этот подзапрос в список выбора. Поместите условие в предложение having в конце (специальный прием MySQL).

SELECT u.*,
       (
          SELECT COUNT(*) 
          FROM messages m 
          WHERE m.user_id = u.id AND m.message_type = 'collection_reminder'
      ) as cnt
FROM users u
WHERE 
 NOT EXISTS (
    SELECT 1 
    FROM events e 
    WHERE e.user_id = u.id AND e.type = 'collection'
 )
AND u.admin IS NULL
HAVING cnt <= 3
0 голосов
/ 11 апреля 2019

Небольшое изменение моего ответа от исходного вопроса:

SELECT u.*, COUNT(DISTINCT m.message_id)
FROM users AS u
LEFT JOIN events AS e ON u.user_id = e.user_id AND e.event_type = 'Collection'
LEFT JOIN messages AS m ON u.user_id = m.user_id AND m.msg_type = 'Collection Reminder'
WHERE u.admin = 0
   AND e.event_id IS NULL        -- No event of type collection
GROUP BY u.user_id -- Note: you should group on all selected fields, and 
                   -- some configuration of MySQL will require you do so.
HAVING COUNT(DISTINCT m.message_id) < 3   -- Less than 3 collection reminder messages 
             -- distinct is optional, but 
             -- if you were to remove the "no event" condition, 
             -- multiple events could multiply the message count.
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...