簡體   English   中英

連接不同表的mysql查詢計算

[英]mysql query calculation with join different tables

我正在使用MySQL 4.2,並且有2個表:

tbl_User存儲USERID和REGCODE。 REGCODE是用於注冊服務的代碼用戶。 tbl_Message存儲每個用戶發布的消息。

我需要查詢tbl_User中的所有用戶以獲取相應的REGCODE以獲得總計。 然后,我想知道有多少這些用戶在tbl_Message中至少有一個條目,其USERID與AUTHORID匹配。 最后一行是用戶發表的百分比。

我的目標是從最后一行的兩個表計算百分比,但是我不確定如何在查詢中聯接表以獲得正確的答案。

表格圖表: http : //img526.imageshack.us/img526/6105/tablep.png

昨天我問了這個問題,@ mathematical.coffee告訴我一個簡單的查詢即可得到我想要的結果。 它起初是有效的,但是我接受COUNT(tbl_User.USERID)發現查詢存在一些問題,並在接受答案后退出了聯接。

從該查詢可以看到,“ COUNT(tbl_User.USERID)作為totalUsers ”受左聯接條件的影響,因此總用戶數是錯誤的。 有人可以幫我嗎,非常感謝!

SELECT REGCODE,
       COUNT(tbl_User.USERID) as totalUsers, 
       COUNT(tbl_Message.MESSAGEID) as usersWhoPosted 
       COUNT(tbl_Message.MESSAGEID)/COUNT(tbl_User.USERID)*100 As Percent
FROM tbl_User 
LEFT JOIN tbl_Message ON tbl_User.USERID=tbl_Message.AUTHORID 
WHERE REGCODE BETWEEN 9001 AND 9008
GROUP BY REGCODE

結果:

REGCODE   totalUsers  usersWhoPosted  Percent
9001      763         233             30.5374
...   
9008      345         235             68.1159

您可以修改查詢以使用DISTINCT usersWhoPostedusersWhoPosted需要修改。 您的查詢正在統計已發布的郵件,而不是已發布的用戶:

SELECT 
    REGCODE,
    COUNT(DISTINCT tbl_User.USERID) AS totalUsers, 
    COUNT(DISTINCT tbl_Message.AUTHORID) AS usersWhoPosted 
    COUNT(DISTINCT tbl_Message.AUTHORID)/COUNT(DISTINCT tbl_User.USERID) * 100 
      AS Percent
FROM tbl_User 
   LEFT JOIN tbl_Message 
     ON tbl_User.USERID = tbl_Message.AUTHORID 
WHERE REGCODE BETWEEN 9001 AND 9008
GROUP BY REGCODE

您也可以像這樣重寫它:

SELECT 
    REGCODE,
    COUNT(*) AS totalUsers, 
    COUNT(HasPosted) AS usersWhoPosted 
    COUNT(HasPosted)/COUNT(*) * 100 
      AS Percent
FROM tbl_User 
   LEFT JOIN (SELECT 1 AS HasPosted) AS dummy 
     ON EXISTS
        ( SELECT *
          FROM tbl_Message
          WHERE tbl_User.USERID = tbl_Message.AUTHORID
        ) 
WHERE REGCODE BETWEEN 9001 AND 9008
GROUP BY REGCODE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM