2017-03-16 32 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);