我有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
知道我做错了什么吗?
答案 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中。