2017-03-16 35 views
2

我有四个表:如何获得使用Mysql的总“活跃”用户?

表A:users_table

表B:users_account_table

表C:fangates_table

表d:downloads_table

表A(users_table)包含3个列: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); 
+1

什么是您的标志,以确定有效和无效的用户? –

+0

一个活跃的用户是一个用户,他的粉丝在donwloads表中有任何下载,但不是他自己 –

回答

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