Mysql计数加入了字段

时间:2014-07-24 14:10:03

标签: php mysql sql join count

我有3个表:帐户,评论和关注者

在帐户中,我会跟踪用户信息,评论他们的评论以及关注者,他们是谁。我想创建一个查询,在那里我可以获得帐户的基本信息,评论数量和关注者数量。我有一个查询但无法正常工作:

SELECT 
    a.company, 
    a.firstname, 
    a.lastname, 
    a.title, 
    a.email, 
    a.zipcode, 
    a.created, 
    a.newsletter, 
    COUNT(c.id) comments, 
    COUNT(f.id) follows, 
    a.linkedinid 
FROM accounts a 
LEFT JOIN comments c ON a.id = c.user_id 
LEFT JOIN followers f ON a.id = f.user_id

知道我做错了什么吗?

2 个答案:

答案 0 :(得分:1)

试试这个

SELECT 
    a.company, 
    a.firstname, 
    a.lastname, 
    a.title, 
    a.email, 
    a.zipcode, 
    a.created, 
    a.newsletter, 
    COUNT(c.id) comments, 
    COUNT(f.id) follows, 
    a.linkedinid 
FROM accounts a 
LEFT JOIN comments c ON a.id = c.user_id 
LEFT JOIN followers f ON a.id = f.user_id 
GROUP BY f.user_id

答案 1 :(得分:1)

认为有两个问题。

首先,您没有GROUP BY子句,因此它将返回所有内容的计数(返回一行),而不是每个帐户的计数。帐户详细信息将来自未定义的行。

其次你只是COUNT(c.id)/ COUNT(f.id)。如果一个帐户有多个跟随和多个评论,那么它将获得这些关注者和帐户的每个组合,因此计数将适用于组合的数量。例如,2条评论和3条粉丝将提供6种组合,两项计数均为6。

通过添加GROUP BY并将DISTINCT添加到COUNT来修复这些问题,可以得到: -

SELECT 
    a.company, 
    a.firstname, 
    a.lastname, 
    a.title, 
    a.email, 
    a.zipcode, 
    a.created, 
    a.newsletter, 
    COUNT(DISTINCT c.id) comments, 
    COUNT(DISTINCT f.id) follows, 
    a.linkedinid 
FROM accounts a 
LEFT JOIN comments c ON a.id = c.user_id 
LEFT JOIN followers f ON a.id = f.user_id
GROUP BY a.company, 
    a.firstname, 
    a.lastname, 
    a.title, 
    a.email, 
    a.zipcode, 
    a.created, 
    a.newsletter, 
    a.linkedinid

请注意,在MySQL中,没有必要GROUP BY所有非聚合字段,只要其他字段依赖于GROUP BY中的字段。但是,如果你这样做的话,大多数其他类型的SQL都会失败,所以最好将它们全部放在GROUP BY中。