当前位置: 首页 > 知识库问答 >
问题:

SQL:选择多个表的计数

爱唯
2023-03-14

我认为这不会太复杂而无法解释,但肯定会很复杂,无法让它发挥作用。

首先,我有两个关于用户评论的表格,每个部分(论坛、文章等)一个表格,如下所示:

site_用户(id、用户名等)[保存用户信息的表]

site_articles_comments(id,user_id,注释,...)[其中user_id=site_users.id]

site_forum_comments(id,user_id,注释,...)[site_articles_comments相同]

问题是,每一行都是一条新评论,用户可以多次评论,这意味着添加了更多的行,因此需要对行数进行排序,以获得某种排序系统中的评论量。

我能够做一个简单的论坛排名通过做这个简单的查询:

选择u.id,u.username,COUNT(r.id)AS rank FROM site\u users AS u LEFT JOIN site\u forum\u comments AS r ON u.id=r.user\u id GROUP BY u.username,u.id ORDER BY rank DESC LIMIT:l

该查询对数据库中的所有用户进行排序,其中评论最多的用户始终位于顶部。

另一方面,我需要的是一个全球排名系统,它汇总每个部分(文章、论坛等)的评论量,并相应地显示用户。

我在玩sql来实现这一点,我最后想到的是一个巨大的查询:

选择u.id,u.username,(COUNT(a.id)COUNT(f.id))作为来自site\u users u LEFT JOIN site\u articles\u comments a ON a.user\u id=u.id LEFT JOIN site\u forum\u comments f ON f.user\u id=u.id GROUP BY u.username,u.id ORDER BY rank DESC LIMIT:l

但是,这返回null。我能做些什么来实现我想要的结果?

提前感谢,

马修斯

EDIT1:很抱歉没有提供信息,这是关于MySQL的。

共有2个答案

施同
2023-03-14

尝试选择u.id,MIN(u.username)作为用户名,(COALESCE(COUNT(DISTINCT(a.id)),0)COALESCE(COUNT(DISTINCT(f.id)),0))作为来自site\u用户的排名,作为u LEFT JOIN site\u articles\u评论,作为ON(a.user\u id=u.id)LEFT JOIN site\u论坛的评论,作为f ON(f.user\u id=u.id)按u.id分组按秩描述限制:l

任伟
2023-03-14

问题是带空值的数学和带空值的排序(查看“NULLS LAST”选项以覆盖默认排序,该排序首先返回空值以进行降序)。

在您的例子中,使用外部连接,如果用户有大量的文章评论,但没有论坛评论,那么在Oracle math中,100 null=null。因此,为了使数学有效,需要将null设置为0。这就是NVL()的用武之地(还有一个很好的副作用,就是从结果集中消除讨厌的空值)!

SELECT u.id, u.username, (NVL(COUNT(a.id),0) + NVL(COUNT(f.id),0)) AS rank 
FROM site_users u 
  LEFT JOIN site_articles_comments a ON a.user_id = u.id 
  LEFT JOIN site_forum_comments f ON f.user_id = u.id 
GROUP BY u.username, u.id ORDER BY rank DESC LIMIT :l

我看到你的标签中同时有MySQL和Oracle——上面是针对Oracle的。如果对于MYSQL,则使用COALESCE(COUNT(),0)。

 类似资料:
  • 我对使用MySQL非常陌生,我还在学习。 假设我有3个表在一个数据库。表格如下: 包含ID(PK)和Name 包含ID(主键)、姓名等 包含rol_num(PK),student_id和course_id。 student_id参考学生(id)course_id参考课程(id) 基本上学生详情在学生表中,课程详情在课程表中,入学表是学生及其课程的链接表 使用Select query命令,如何获取所

  • 问题内容: 所以这是我的设置,我有2个具有以下(简化)模式的旧表和新表 我正在寻找一种SQL查询,该查询返回以下内容,但在1个查询中包含4列,而不是每个2列包含2个查询 因此,我理想的结果集将包含4列: 谢谢! 问题答案: 您是否尝试过JOIN语句:

  • 问题内容: 假设我有一张桌子: 这将返回自特定日期以来销售数量的产品清单。有没有一种方法不仅可以选择这个和,而且还可以选择没有where条件的和?我想查看每种产品自特定日期以来的销售情况以及所有(没有日期限制)的销售情况。 问题答案:

  • 问题内容: 产生5行(5个数组),是一行中唯一的唯一字段。重复( 在这里 重复3次。 )我如何摆脱这些重复? 编辑: 我想要和所有为每个饮料。 问题答案: 您在这里所做的称为a (尽管您是隐式执行的,因为您是从多个表中选择的)。这意味着,如果您未在WHERE子句中放置任何条件,则您将拥有这些表的 所有组合 。仅根据您的条件,您才可以将联接限制为饮料ID匹配的行。 但是,如果有X张包含此特定Drin

  • 问题内容: 我需要根据其他几个表中的某些匹配值从一个表中选择结果。我有以下表格: 我需要返回每个团队的所有教练和球员的姓名。我只使用过内部联接,似乎无法在此处使用那些内部联接,所以知道如何执行此操作吗? 问题答案: 这将为您提供教练: 这将为您提供球员: 因此,非优雅,简单的答案就是将所有内容与一起扔掉。

  • 我有两张桌子 客户(ID,First_Name,Last_Name,地址); 订单(ID,Product_Name,价格,Order_Date日期,Customer_ID,金额); 我必须选择客户的姓氏以及他们的订单数量。 select请求的输出必须是