Mysql 三个表连接并计数,显示错误结果

Mysql 三个表连接并计数,显示错误结果,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,我有3个表,我需要从catalog、join ratings表和join to comments表中获取所有信息,然后按catalog帖子统计评论,我的SQL查询: SELECT catalog.catalog_id, catalog.slug, catalog.title, catalog.city, catalog.street, catalog.image COUNT(ratings.rate) AS votes, COUNT(com

我有3个表,我需要从catalog、join ratings表和join to comments表中获取所有信息,然后按catalog帖子统计评论,我的SQL查询:

SELECT
    catalog.catalog_id,
    catalog.slug,
    catalog.title,
    catalog.city,
    catalog.street,
    catalog.image COUNT(ratings.rate) AS votes,
    COUNT(comments.catalog_id) AS total_comments,
    ROUND(SUM(ratings.rate) / COUNT(ratings.rate)) AS average
FROM
    catalog
LEFT JOIN ratings ON ratings.object_id = catalog.catalog_id
LEFT JOIN comments ON comments.catalog_id = catalog.catalog_id
GROUP BY
    catalog.catalog_id
ORDER BY
    average,
    votes DESC
所有内容都只显示了好的注释总数,坏的数字是6,但在注释表中只有2行,所以结果很糟糕。我认为这是分组的问题。我已尝试按catalog.catalog\u id、comments.catalog\u id添加
组,但没有帮助。
我的桌子:


问题是你有多个评级和评论,所以你得到的是每个帖子的笛卡尔乘积

正确的解决方案是在连接之前预聚合数据

SELECT c.*, r.votes, c.total_comments,
       ROUND(sumrate / votes) AS average
FROM catalog c LEFT JOIN
     (SELECT r.object_id, COUNT(*) as votes, SUM(r.rate) as sumrate
      FROM ratings r
      GROUP BY r.object_id
     ) r
     ON r.object_id = c.catalog_id LEFT JOIN
     (SELECT c.catalog_id, COUNT(*) as total_comments
      FROM comments c
      GROUP BY c.catalog_id
     ) c
     ON c.catalog_id = c.catalog_id
GROUP BY c.catalog_id
ORDER BY average, votes DESC;

是的,它有效!结果几乎是好的,但现在我不明白为什么排序不能正确使用“ORDER BY average,Voces DESC”,因为我需要最高的平均值,投票从顶部到底部,但DESC没有解决什么问题。我在机器人最后一个var_dump中的结果是最高的,而不是最高的。@SkySonny。我建议你问另一个关于排序的问题,如果这产生了正确的数字。