【问题标题】:Mysql subquery errors when trying to join tables (making rating system)尝试连接表时出现Mysql子查询错误(制作评分系统)
【发布时间】:2013-09-02 16:09:40
【问题描述】:

好的,这是我遇到的问题。有两个表用于处理博客 cmets 和这些 cmets 的评级。每次登录用户对帖子进行评分时,它都会在“commentrate”表中插入一个新行。 'commentrate' 有 4 个字段。设置为 auto_increment、author_id、comment_id(已评级评论的 ID 号)的 ID,以及 1 到 5 级的评级本身。

实际 cmets 的表有一个 commentid 字段,它将与 commentrate 表中的 comment_id 匹配。

我需要的是一个 Mysql 查询,它将使用其 commentid 获取博客 cmets 表中的每条评论,并将其与具有相同 comment_id 的所有评级的平均值相匹配。

这样做的目的是建立一个评分最高的帖子页面。

我有一个查询,如果您指定comment_id,它将返回一个包含comment_id 和平均评分的结果集。但是,我无法使此查询适用于博客 cmets 表中的每个评论 ID。该查询是:

SELECT commentrate.comment_id, AVG(commentrate.rating) from commentrate WHERE commentrate.comment_id=35

我尝试使用子查询和连接来实现这一点,但它不起作用或只会返回一行或会给我一条错误消息。我尝试过的查询将在下面发布。任何帮助,将不胜感激。几天来我一直徒劳地想弄清楚这一点。谢谢。

SELECT bd_comments.commentid, bd_comments.comment FROM bd_comments WHERE bd_comments.commentid = ALL (SELECT commentrate.comment_id, floor(AVG(commentrate.rating)) from commentrate WHERE commentrate.comment_id=bd_comments.commentid)

错误:#1241 - 操作数应包含 1 列

SELECT bd_comments.commentid, bd_comments.comment FROM bd_comments WHERE bd_comments.commentid = ALL (SELECT commentrate.comment_id, floor(AVG(commentrate.rating)) from commentrate WHERE commentrate.comment_id=bd_comments.commentid)

错误:#1241 - 操作数应包含 1 列

【问题讨论】:

    标签: php mysql subquery system rating


    【解决方案1】:

    我认为您只想将表格连接在一起并取平均值:

    select bd.commentid, floor(avg(cr.rating))
    from commentrate cr join
         bd_comments c
         on cr.comment_id = bd.commentid
    group by bd.commentid;
    

    如果您的博客 cmets 表中有重复的 cmets,那么您可能需要:

    select cr.comment_id, floor(avg(cr.rating))
    from commentrate cr
    where cr.comment_id in (select bd.commentid from bd_comments);
    

    【讨论】:

    • commentrate的表结构如下: id author_id comment_id rating 23 1 35 5 24 3 35 2 25 3 36 4 最后两行可以看到多个不同的作者可以评价相同的评论。 bd_cmets的表结构如下: commentid postid author_id comment created 35 25 1 Well.. 2013-08-28 18:49:25 36 25 3 eergerg 2013-08-30 08:46:06
    • 我的目标是创建一个表来跟踪平均评分,并且还包含 bd_cmets 中每个唯一评论 ID 的评论和作者 ID。下面是我希望让 MySQL 做的一个示例: commentid postid author_id comment created avgrating 35 25 1 Well.. TIMESTAMP 4 36 26 2 comment TIMESTAMP 4 对于每个 commentid,平均评分都连接到表的末尾。我需要对 bd_cmets 中的每个 commentid 进行此平均。
    • 换句话说,上面示例的 avgrating 将通过以下方式返回: SELECT floor(avg(commentrate.rating)) WHERE bd_cmets.commentid = 35 此语句选择特定commentid的所有评级的平均值但是,我需要返回每个唯一 bd_cmets.commentid 的平均 commentrate.rating 并将其连接到正确的 bd_cmets 行,这样我就可以得到上面示例中 bd_cmets 中所有 commentid 的结果。感谢您在此问题上提供的所有帮助。
    【解决方案2】:

    收到了这个答案,效果很好:

    创建表 bd_cmets ( 注释 int , 评论 varchar(10), author_id 整数 );

    创建表评论率 ( comment_id int , 评级int, author_id 整数 );

    插入 bd_cmets 价值观 (1, "评论 1", 100), (2, "评论 2", 200), (3, "评论 3", 300);

    插入评论率 价值观 (1, 3.5, 100), (2, 4, 100), (3, 5, 100), (1, 2.5, 200), (2, 1, 200);这里是查询

    SELECT cr.comment_id, floor(avg(cr.rating)) rating,c.comment, c.author_id FROM commentrate cr, bd_cmets c 在哪里 cr.comment_id = c.commentid GROUP BY cr.comment_idOutput

    | COMMENT_ID |评级 |评论 |作者 ID | |------------|--------|------------|-----------| | 1 | 3 |评论 1 | 100 | | 2 | 2 |评论 2 | 200 | | 3 | 5 |评论 3 | 300 |

    【讨论】:

      猜你喜欢
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      相关资源
      最近更新 更多