2016-05-23 74 views
0
與計數,按組,以便通過和工會選擇

我有以下三個表:失敗在MySQL

theUser(*user_id*, user_name) 
ichat(*message_id*, sender, receiver, send_time) 
gchat(*message_id*, sender, receiver, send_time) 

的iChat和Google即時通訊之間的唯一區別是,在iChat中receiver是用戶,它是組gchat。但是這個問題沒有影響。

現在我想找出最活躍的n用戶(用戶名和發送的相應消息數),這意味着誰出現頻率最高的是sender。而下面是代碼,我曾嘗試:

SELECT COUNT(totalM.*) AS msge, u.name 
    FROM (
     SELECT * FROM gchat 
     UNION ALL 
     SELECT * FROM ichat) AS totalM 
    JOIN theUser u ON totalM.sender=u.user_id 
    GROUP BY totalM.sender 
    ORDER BY COUNT(*) 

,但得到這樣的錯誤:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '*) AS msge, u.name. 

你有任何想法?先謝謝你!

+1

嘗試'count(*)'而不是'count(totalM。*)'計數應該是一樣的嗎?因爲它是1-1關係,我不認爲引擎喜歡試圖在連接的一邊計算記錄。並且您的組應與選擇的非聚合列匹配。 – xQbert

回答

1
SELECT COUNT(*) AS msge, u.name 
    FROM (
     SELECT * FROM gchat 
     UNION ALL 
     SELECT * FROM ichat) AS totalM 
    JOIN theUser u ON totalM.sender=u.user_id 
    GROUP BY u.Name 
    ORDER BY COUNT(*) 
  1. GROUP BY應與非聚合選擇列
  2. 我相信,發動機不能算表的一側加入。在開始計數之前,它不知道關係是1-1還是1-M,所以它必須計數兩邊因此計數(*)。

或者你可以切換兩個計數(*)的計數(1)爲我相同的效果。

+0

謝謝,它的作品!但爲什麼它應該是'GROUP BY u.Name'而不是'totalM.sender'? – user5779223

+0

u.name在選擇中。 totalm.sender不是。我知道他們的網絡價值相同,但你應該根據你的選擇進行分組! (非彙總) – xQbert

+0

@ user5779223如果您有多個具有相同名稱的用戶,則按名稱分組會合並其計數;所以你可能仍然想通過user_id | sender進行分組;但是,如果是這種情況,則只有少數情況下您不想選擇user_id。 – Uueerdo