2012-01-31 52 views
1

我使用MySQL 4.2,我有2个表:MySQL查询计算与加入不同的表

tbl_User商店的用户ID和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 
+0

'COUNT(DISTINCT tbl_User.USERID)作为totalUsers' – 2012-01-31 00:24:40

回答

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 
+0

感谢@ypercube。现在用户总数是正确的。但是,COUNT(tbl_Message.MESSAGEID)不会输出正确的数字,这些用户中有多少用户在tbl_Message中至少有一个其USERID与AUTHORID相匹配的条目。它似乎计算了用户的消息总数。 – user1177437 2012-01-31 00:34:23

+0

是的,看我的编辑。 – 2012-01-31 00:37:58

+0

你是男人!谢谢! – user1177437 2012-01-31 00:56:22