我正在使用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
答案 0 :(得分:1)
您可以修改查询以使用DISTINCT
。 usersWhoPosted
计数也需要修改。您的查询是计算发布的消息,而不是发布的用户:
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