2012-01-30 94 views
0

我正在使用MySQL 4.2。从两个表格计算MySQL查询

我有2个表:

  • tbl_User商店的用户ID和REGCODE。 REGCODE是用于注册服务的代码用户。
  • tbl_Message存储由每个用户发布的消息。

我需要查询tbl_User中的所有用户的相应REGCODE才能获得总数。 然后,我想知道这些用户中有多少人在tbl_Message中至少有一个其USERID与AUTHORID相匹配的条目。 最后一行是用户拥有帖子的百分比。

我的目标是计算最后一行中两个表的百分比,但我不确定如何在查询中连接表以获得正确答案。谢谢你的帮助!

表图表: http://img526.imageshack.us/img526/6105/tablep.png

这里是我使用的查询:

Select 'Percentage', 
    Sum(Case 
    When tbl_User.REGCODE = 9001 And 
    tbl_User.USERID = tbl_Message.AUTHORID Then 1 Else 0 
    End)/Sum(Case When tbl_User.REGCODE = 9001 Then 1 Else 0 End) * 100.0, 
    Sum(Case 
    When tbl_User.REGCODE = 9002 And 
    tbl_User.USERID = tbl_Message.AUTHORID Then 1 Else 0 
    End)/Sum(Case When tbl_User.REGCODE = 9002 Then 1 Else 0 End) * 100.0, 
    Sum(Case 
    When tbl_User.REGCODE = 9003 And 
    tbl_User.USERID = tbl_Message.AUTHORID Then 1 Else 0 
    End)/Sum(Case When tbl_User.REGCODE = 9003 Then 1 Else 0 End) * 100.0, 
    Sum(Case 
    When tbl_User.REGCODE = 9004 And 
    tbl_User.USERID = tbl_Message.AUTHORID Then 1 Else 0 
    End)/Sum(Case When tbl_User.REGCODE = 9004 Then 1 Else 0 End) * 100.0, 
    Sum(Case 
    When tbl_User.REGCODE = 9005 And 
    tbl_User.USERID = tbl_Message.AUTHORID Then 1 Else 0 
    End)/Sum(Case When tbl_User.REGCODE = 9005 Then 1 Else 0 End) * 100.0, 
    Sum(Case 
    When tbl_User.REGCODE = 9006 And 
    tbl_User.USERID = tbl_Message.AUTHORID Then 1 Else 0 
    End)/Sum(Case When tbl_User.REGCODE = 9006 Then 1 Else 0 End) * 100.0, 
    Sum(Case 
    When tbl_User.REGCODE = 9007 And 
    tbl_User.USERID = tbl_Message.AUTHORID Then 1 Else 0 
    End)/Sum(Case When tbl_User.REGCODE = 9007 Then 1 Else 0 End) * 100.0, 
    Sum(Case 
    When tbl_User.REGCODE = 9008 And 
    tbl_User.USERID = tbl_Message.AUTHORID Then 1 Else 0 
    End)/Sum(Case When tbl_User.REGCODE = 9008 Then 1 Else 0 End) * 100.0 
From tbl_User 
left Join tbl_Message 
tbl_Message ON tbl_User.USERID = tbl_Message.AUTHORID 
Where tbl_Message.AUTHORID IS NOT NULL 
+0

噢,我的天啊..我的头 – 2012-01-30 06:07:10

+0

请问您可以添加两张桌子的结构吗?这将有助于 – Kangkan 2012-01-30 06:07:34

+0

如果你解释(用文字)你正在尝试做什么 - 例如“每个用户收件箱中他们是作者的邮件的百分比”? – 2012-01-30 06:10:27

回答

2

你可以这样说:

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 

在列中使用REGCODE比列更容易。否则,你一直在为你感兴趣的每个REGCODE写一个巨大的笨拙的查询,就像你正在使用的那样。

如果你真的必须把表转换(即交换行/列),以编程方式进行(例如在PHP中,如果这就是你使用的MySQL)。

+0

这正是我正在寻找的答案。非常感谢! – user1177437 2012-01-30 07:34:26

+0

我有一个关于总用户数的问题。作为totalUsers的COUNT(tbl_User.USERID)受到LEFT JOIN tbl_Message ON tbl_User.USERID = tbl_Message.AUTHORID的影响。如果我只COUNT(tbl_User.USERID),数字不同于使用LEFT JOIN。我怎样才能克服这个问题?谢谢。 – user1177437 2012-01-30 10:58:48

+0

啊,你是对的 - 我不得不在第二天跳过这个,因为我很忙,但我会看看它后(或其他人欢迎!) – 2012-01-30 12:08:22