MySQL,SUM 运算中的 DISTINCT

标签 mysql sql sum

目前,我尝试根据用户性别计算应用程序中的唯一用户访问数量。这是计算所有访问次数的示例查询(不是唯一的)

SELECT
    DATE(v.visited_at) AS visit_date,
    SUM(IF(u.gender = 'M', 1, 0)) AS male_visit,
    SUM(IF(u.gender = 'F', 1, 0)) AS female_visit,
    SUM(IF(u.gender = '' OR u.gender IS NULL, 1, 0)) AS unknown_visit
FROM 
    visits v
    INNER JOIN users u ON v.user_id = u.id
WHERE
    DATE(v.visited_at) >= DATE_SUB(SYSDATE(), INTERVAL 30 DAY)
    AND v.duration > 30
GROUP BY
    DATE(v.visited_at)

尝试使用子查询并计算不同的它是有效的,但速度慢了 4 倍。

SELECT
    DATE(visited_at) as visit_date,
    (SELECT COUNT(DISTINCT u.id) FROM visits v JOIN users u ON v.user_id = u.id WHERE u.gender = 'M' AND DATE(v.visited_at) = visit_date AND v.duration > 30) AS male_visit,
    (SELECT COUNT(DISTINCT u.id) FROM visits v JOIN users u ON v.user_id = u.id WHERE u.gender = 'F' AND DATE(v.visited_at) = visit_date AND v.duration > 30) AS female_visit,
    (SELECT COUNT(DISTINCT u.id) FROM visits v JOIN users u ON v.user_id = u.id WHERE u.gender = '' OR u.gender IS NULL AND DATE(v.visited_at) = visit_date AND v.duration > 30) AS unknown_visit
FROM 
    visits v
WHERE
    DATE(visited_at) >= DATE_SUB(SYSDATE(), INTERVAL 30 DAY)
GROUP BY
    DATE(visited_at)

对此有什么建议吗?

最佳答案

COUNT(DISTINCT) 总是比 COUNT() 慢。您可以尝试:

SELECT DATE(v.visited_at) AS visit_date,
       COUNT(DISTINCT CASE WHEN u.gender = 'M' THEN u.id END) AS male_visit,
       COUNT(DISTINCT CASE WHEN u.gender = 'F' THEN u.id END) AS female_visit,
       COUNT(DISTINCT CASE WHEN u.gender = '' OR u.gender IS NULL THEN u.id END) AS unknown_visit
FROM visits v INNER JOIN
     users u
     ON v.user_id = u.id
WHERE DATE(v.visited_at) >= DATE_SUB(SYSDATE(), INTERVAL 30 DAY) AND
      v.duration > 30
GROUP BY DATE(v.visited_at);

不过我不知道是否会快很多。

关于MySQL,SUM 运算中的 DISTINCT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51175083/

相关文章:

sql - 如何选择不使用 SQL JOIN

来自带有 FIND_IN_SET 的两个表的 MYSQL 请求

MySQL一对多映射查询-如果匹配很多,不返回一个

c# - 如何在 C# 中表示 MySQL 数据库模式?

sql - 将 int、float 和 boolean 存储在同一数据库列中

php - MYSQL删除语句删除太多行

r - 对于给定标识符,按日期范围对行求和

php - MySQL - 根据同一表上的相同字段获取列值的总和

matlab - 在 Matlab 中矢量化条件求和循环

php - Laravel 查询构建器条件与当前查询使用何时