正在尝试连接MySQL中的3个表

正在尝试连接MySQL中的3个表,mysql,sql,join,Mysql,Sql,Join,我有三张相连的桌子。我几乎有了解决方案,但这里似乎有一个小问题。以下是声明: SELECT items.item, COUNT(ratings.item_id) AS total, COUNT(comments.item_id) AS comments, AVG(ratings.rating) AS rate FROM `items` LEFT JOIN ratings ON (ratings.item_id = items.items_id) LEFT JOIN comments ON (co

我有三张相连的桌子。我几乎有了解决方案,但这里似乎有一个小问题。以下是声明:

SELECT items.item,
COUNT(ratings.item_id) AS total,
COUNT(comments.item_id) AS comments,
AVG(ratings.rating) AS rate
FROM `items`
LEFT JOIN ratings ON (ratings.item_id = items.items_id)
LEFT JOIN comments ON (comments.item_id = items.items_id)
WHERE items.cat_id = '{$cat_id}'  AND items.spam < 5
GROUP BY items_id ORDER BY TRIM(LEADING 'The ' FROM items.item) ASC;");
我有一个名为items的表,每个项都有一个名为items的id,注意它是复数形式。我有一个针对每个项目的单独用户评论表,以及一个针对每个项目的评分表。最后两个有一个名为“item_id”的对应列

我只想分别计算每个项目的评论和评分总数。按照上面SQL语句的方式,它们是一个整体

注意,total是评级的总和。这是一个糟糕的命名方案,我需要修正!
更新:“总计”似乎计数正常,但当我向“注释”表添加注释时,计数函数同时影响“注释”和“总计”,并且似乎等于组合输出。

问题是,您正在计算所有3个合并表的结果。尝试:

SELECT i.item,
r.ratetotal AS total,
c.commtotal AS comments,
r.rateav AS rate
FROM items AS i
LEFT JOIN
    (SELECT item_id, 
    COUNT(item_id) AS ratetotal, 
    AVG(rating) AS rateav 
    FROM ratings GROUP BY item_id) AS r 
ON r.item_id = i.items_id
LEFT JOIN
    (SELECT item_id, 
    COUNT(item_id) AS commtotal 
    FROM comments GROUP BY item_id) AS c
ON c.item_id = i.items_id
WHERE i.cat_id = '{$cat_id}'  AND i.spam < 5
ORDER BY TRIM(LEADING 'The ' FROM i.item) ASC;");

在这个查询中,我们让子查询正确地进行计数,然后将该值发送到主查询并过滤结果。

我猜这是一个基数问题。请尝试COUNTdistinct comments.item_id

那么有什么问题?如何加入?如何计算?如何生成json?COUNTcomments.item_id作为注释似乎执行不正确。我的SQL逻辑正确吗?我有没有犯过什么明显的错误?我知道你在做什么,我很喜欢。继续获取“mysql\u fetch\u assoc:提供的参数不是有效的mysql结果”。试着超越它,看看这是否符合我的要求。就是这样!我刚把I改为items,你的答案很完美!甚至没有意识到你可以做子查询。谢谢你的洞察力!抱歉,忘记为“items”表添加别名。从项目,因为我也会修复它。当您要求数据库处理越来越复杂的事情时,子查询非常方便。