【问题标题】:MySQL query with calculation from two tables从两个表计算的 MySQL 查询
【发布时间】:2012-01-30 06:03:29
【问题描述】:

我使用的是 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

这是我正在使用的查询:

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

【问题讨论】:

  • 请问可以添加两张表的结构吗?这会有所帮助
  • 如果您(用文字)解释您正在尝试做的事情会有所帮助 - 例如“每个用户的收件箱中他们是其作者的邮件的百分比”?
  • 我已经添加了我的表格,谢谢大家
  • 我有 2 个表:tbl_User 存储 USERID 和 REGCODE。 REGCODE 是用户用于注册服务的代码。 tbl_Message 存储每个用户发布的消息。我需要查询 tbl_User 中的所有用户以获取相应的 REGCODE 以获得总数。然后,我想知道这些用户中有多少在 tbl_Message 中至少有一个条目,他们的 USERID 与 AUTHORID 匹配。最后一行是用户发帖的百分比。

标签: mysql


【解决方案1】:

你可以这样做:

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 编写一个庞大而笨拙的查询。

如果您确实必须对表进行转置(即交换行/列),请以编程方式进行(例如,如果您使用的是 MySQL,则在 PHP 中)。

【讨论】:

  • 这正是我正在寻找的答案。非常感谢!
  • 我对 totalUsers 的数量有疑问。作为 totalUsers 的 COUNT(tbl_User.USERID) 受 LEFT JOIN tbl_Message ON tbl_User.USERID=tbl_Message.AUTHORID 的影响。如果我只 COUNT(tbl_User.USERID),则该数字不同于使用 LEFT JOIN。我该如何克服这个问题?谢谢。
  • 啊,你是对的 - 我必须在第二天左右跳过这个,因为我很忙,但我会在之后看看它(或者欢迎其他人! )
  • 别担心..我知道你很忙。感谢您的所有帮助。另一个好人帮我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2019-07-08
  • 2021-11-07
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多