mysql查询计算与连接不同的表

时间:2012-01-31 00:14:08

标签: mysql

我正在使用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)as 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

1 个答案:

答案 0 :(得分:1)

您可以修改查询以使用DISTINCTusersWhoPosted计数也需要修改。您的查询是计算发布的消息,而不是发布的用户:

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