mysql - 如何使用 Mysql 获取总计 "active"个用户?

标签 mysql

我有四个表:

表A:用户表

表 B:users_account_table

表 C:fangates_table

表 D:downloads_table

表 A(users_table) 包含三列:ID、NAME 和 GATE_COUNT。 表 C(fangates_table)包含用户门。 表 D(downloads_table) 包含 fangates_table_id 和 account_id。

TABLE A
ID  |   NAME    |   GATE_COUNT
---------------------------
1   |   Joy     |   2        
---------------------------
2   |   Ash     |   0
---------------------------
3   |   Nik     |   2
---------------------------
4   |   Wox     |   0

TABLE B
ID  |   A_ID    |   ACCOUNT_ID
---------------------------
1   |   1       |   123456       
---------------------------
2   |   1       |   654321
---------------------------
3   |   3       |   5888
---------------------------
4   |   3       |   8787


TABLE C
ID  |   A_ID    |   TITLE
---------------------------
1   |   1       |   ABCD         
---------------------------
2   |   1       |   DFCV
---------------------------
3   |   3       |   FGTG
---------------------------
4   |   3       |   FRGTG

TABLE D
ID  |   C_ID    |   ACCOUNT_ID
---------------------------
1   |   1       |   123456       
---------------------------
2   |   2       |   123456
---------------------------
3   |   3       |   7859
---------------------------
4   |   1       |   7585

从上面的表格中,我试图获得“活跃”用户总数(其中活跃用户定义为具有 fangates 的用户,除了他们自己之外还有任何下载)

我尝试了以下查询,但失败了。

SELECT COUNT(*) FROM D
WHERE (C_ID,ACCOUNT_ID)
NOT IN 
(SELECT C.ID, B.ACCOUNT_ID FROM A 
LEFT JOIN B ON A.ID = B.A_ID 
LEFT JOIN C ON A.ID = C.A_ID
WHERE A.GATE_COUNT >0);

最佳答案

如我所见,错误是您未能在表的初始选择中提供连接参数。如果我正确理解您的表设计,则以下查询将检索您表中的所有信息:

SELECT *
FROM A,B,C,D
WHERE B.A_ID = A.ID AND C.A_ID = A.ID AND D.C_ID = C.ID; 

如果我的假设是正确的,并且您正在尝试获得活跃用户,您可以简单地将您的参数作为附加的 AND 放置,然后继续。但是,执行如此多的连接会大大降低任何代码的速度;连接是一个非常费力的过程,无论表有多小。由于您要查找下载次数

SELECT COUNT(*) FROM D
WHERE (C_ID)
NOT IN 
(SELECT C.ID FROM A, C 
WHERE GATE_COUNT >0 AND A.ID = C.A_ID);

据我所知,您不需要从 B 表中指定不同的 ACCOUNT_ID,因为信息与 B 表明显配对。否则,您的列将不匹配。

否则,您可以进行第二次查找并尝试将 B 查找添加为 AND 参数

SELECT COUNT(*) FROM D
WHERE (C_ID)
NOT IN (SELECT C.ID FROM A, C 
WHERE GATE_COUNT >0 AND A.ID = C.A_ID) AND ACCOUNT_ID NOT IN
(SELECT DISTINCT B.ACCOUNT_ID FROM A,B WHERE A.ID = B.A_ID AND A.GATE_COUNT >0);

关于mysql - 如何使用 Mysql 获取总计 "active"个用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42840468/

相关文章:

mysql - Hibernate 不填充 AUTO_INCREMENT 列作为复合 PK、错误或反功能的一部分?

mysql - 如何将 Access 2003 数据库链接到 MySQL 数据库

MySQL嵌套,嵌套子查询无法获取外部变量

Mysql 订单日期 按 m/h/s

mysql - 在 Apache Airflow 中,如何将宏结果作为参数传递给存储在单独的 .sql 文件中的 sql 查询

MySQL:在不使用 Distinct 的情况下将表与自身连接

mysql - WordPress WooCommerce 删除具有重复 SKU 的项目

mysql - 我需要从 mysql 表中获取所有唯一数据并将其放入新表中

mysql - 月份特定查询 Mongodb 和 laravel

sql - mysql分组问题