mysql:计算所有组中的重复行

标签 mysql

假设我有以下表格:

id  |       fb_id    |   date    | 
----     ----------    ---------     
1         1123           2009-1-1        
2         1145           2009-1-1       
3         1123           2009-1-2        
4         1176           2009-1-2        

我想统计每个日期的总用户数、唯一身份用户总数和回访用户数。

我现在的代码是这样的:

SELECT count(DISTINCT fb_id) as uniqueUsers, count(fb_id) as totalUsers, DATE_FORMAT(date, '%d %b %y') as zoom  FROM ".PREFIX."zoom GROUP BY YEAR(date), MONTH(date), DAY(date)

我期待以下结果:

Group 2009-1-1:
-total users: 2
-unique users: 2
-returning users:0

Group 2009-1-2:
-total users: 2
-unique users: 1
-returning users:1 (total users - unique users)

但我得到的是:

Group 2009-1-1:
-total users: 2
-unique users: 2
-returning users:0

Group 2009-1-2:
-total users: 2
-unique users: 2
-returning users:0 (total users - unique users)

有什么想法可以让这项工作成功吗?

最佳答案

您可以进行自连接。像这样

示例数据

CREATE TABLE zoom
    (`id` int, `fb_id` int, `date` datetime);

INSERT INTO zoom
    (`id`, `fb_id`, `date`)
VALUES
    (1, 1123, '2009-01-01 00:00:00'),
    (2, 1145, '2009-01-01 00:00:00'),
    (3, 1123, '2009-01-02 00:00:00'),
    (4, 1176, '2009-01-02 00:00:00');

查询

SELECT
    count(Znew.fb_id) as totalUsers,
    count(Zold.fb_id) as returningUsers,
    count(Znew.fb_id) - count(Zold.fb_id) as uniqueUsers,
    DATE_FORMAT(Znew.date, '%d %b %y') as zoom
FROM zoom Znew
LEFT JOIN zoom Zold
    ON Zold.date < Znew.date
    AND Zold.fb_id = Znew.fb_id
GROUP BY Znew.date;

SQL Fiddle

输出

totalUsers  returningUsers  uniqueUsers zoom
2   0   2   01 Jan 09
2   1   1   02 Jan 09

关于mysql:计算所有组中的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33340594/

相关文章:

php - 准备好的 SQL 语句不是 'preparing'

php - 将日期时间从 mysql 转换为人类可读的字符串

使用 JOIN 和嵌套 NOT IN 的 Mysql 查询

PHP 搜索功能不显示结果

php - 如果mysql数据类型是默认值为 "0000-00-00 00:00"的时间戳,如何检查是否为空?

mysql - 在 rails 中检查数据库中的重复记录

php - 如果其他人打开了记录,我如何防止其他人打开它?

mysql - 帮助设置 sphinx

java - 如何在Linux操作系统的NetBeans上连接MySql?

php - MySql 整个数据库(表和实体)与备份一起删除。有没有办法重新创建它。