首页 > 解决方案 > 从嵌套选择语句中检索计数

问题描述

我有以下查询,它完全按预期工作(感谢 stackoverflow 的乐于助人的人)。但是,我意识到除了使用计数来验证消息是否 <= 3 之外,我还想检索结果中返回的每一行的实际数量/计数。

这样我就可以根据每个返回的用户有多少消息来自定义逻辑。

我尝试了几种不同的选择,但效果不佳。

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

标签: mysqlsql

解决方案


将该子查询移至选择列表。将条件放在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

推荐阅读