如何使用Mysql获得总“活跃”用户?

时间:2017-03-16 17:05:04

标签: mysql mysqli

我有四张桌子:

表A:users_table

表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);

2 个答案:

答案 0 :(得分:1)

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

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);

答案 1 :(得分:0)

SELECT COUNT(DISTINCT(B.A_ID))
FROM TABLE_B B
JOIN TABLE_C C ON (B.A_ID = C.A_ID)
JOIN TABLE_D D ON (D.C_ID = C.C_ID AND B.ACCOUNT_ID <> D.ACCOUNT_ID)