mysql - 带连接的双重计数查询

标签 mysql

我有四个表,我需要获得 2 个计数,然后按用户表对它们进行分组。

SELECT  (
    SELECT COUNT(*)
        FROM  user_share us
        INNER JOIN user_share_recipient usr
        ON usr.share_id = us.id
        WHERE usr.sent_at BETWEEN '2013-11-01' AND '2013-11-31'
    ) AS Shares,
    (
    SELECT COUNT(*)
    FROM   resource_tracking
    WHERE created_at BETWEEN '2013-11-01' AND '2013-11-31'
    ) AS Views

FROM    dual

这可以从三个表中获取总计数,但我需要加入第四个用户表,然后按用户名对每个表进行分组。所以我可以

select first name, last name (then the shares count)(then the views count) 
from users (join the tables above on user_id columns on both tables)
 group by username

所以我最终得到这样的结果:

First Name    Last Name     Shares    Views

  John         Smith         20        40     

这可能吗?我不能使用临时表

最佳答案

试试这个:

SELECT u.first_name, 
       u.last_name, 
       COALESCE(Shares.s_count,0), 
       COALESCE(VIEWS.v_count,0)
FROM users u
LEFT JOIN (
  SELECT us.user_id, COUNT(*) AS s_count
  FROM user_share us
  INNER JOIN user_share_recipient usr ON usr.share_id = us.id
  WHERE usr.sent_at BETWEEN '2013-11-01' AND '2013-11-31'
  GROUP BY us.user_id
  ) AS Shares ON u.user_id = Shares.user_id
LEFT JOIN (
  SELECT user_id, COUNT(*) AS v_count
  FROM resource_tracking
  WHERE created_at BETWEEN '2013-11-01' AND '2013-11-31'
  GROUP BY user_id
  ) AS VIEWS ON u.user_id = VIEWS.user_id

使用 LEFT JOIN 获得结果,即使没有共享或 View 。在这些情况下使用 COALESCE TO 将它们设为 0。

关于mysql - 带连接的双重计数查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20355039/

相关文章:

mysql - 检索聚合函数受条件约束的记录

php - 从sql语句创建多个CSV文件

python - Django 更新该行(如果存在)

mysql - 如何进行计数查询并连接两个表

mysql - Scala Slick : MTable. getTables 返回空向量/列表

php - 如何将存储的数据库 utc 时间戳数据转换为 PHP 中的本地时区

mysql - 范围 IP 的远程 MySQL 连接

java - 如何在 grails 独立应用程序中嵌入 mysql

mysql - 如何创建这个表? #1071 - 指定的 key 太长;最大 key 长度为 1000 字节

php - Mysql通过远程连接DB进行查询