2015-05-16 100 views
0

我试图计算配置文件访问的次数,但它计算错误的数字。在下面的例子中,应该有3次访问,但它计数为6!任何人都知道它有什么问题吗? http://sqlfiddle.com/#!9/b43ea/8SQL - COUNT()计算错误的数字

SELECT *, 
COUNT(profile_visitors.profile_id) AS visitorCount 
FROM profile_visitors 
LEFT JOIN user_login ON user_login.user_id = profile_visitors.user_id 
WHERE profile_visitors.user_id = 1 
+1

你有两列在表USER_LOGIN USER_ID = 1,所以在连接后,你将有2 * 3 = 6行。也许user_login表的第二行是为了保存另一个user_id? – jpw

+0

你的sql小提琴有错误的数据表user_login .....它有重复的用户ID两次 – HaveNoDisplayName

+0

为什么你需要加入登录表来获取个人资料访问的次数?您只能从profile_visitors中完全获得总计数或每位用户数。如果要用计数显示用户信息,则需要先进行分组,稍后再加入用户表(而不是user_login表)。 – Tim3880

回答

1

您需要集团通过数多行,所以坐天星出你的查询,并通过USER_ID添加组也使其profile_visitors。*

+0

尽管这是一个很好的建议(除了最后一部分)它不会解决由重复数据造成的问题。 – jpw

+0

你可以在这里执行你的查询:http://sqlfiddle.com/#!9/b43ea/8 –

+1

@jpw: - 我认为OP在将数据放在表user_login中时出现了错字,其中OP错误地将userid两次 – HaveNoDisplayName

0

可以使用WHERE IN()如果比较存在于user_login

SELECT *, 
COUNT(profile_visitors.user_id) AS visitorCount 
FROM profile_visitors 
WHERE profile_visitors.user_id IN (SELECT user_id FROM user_login) 

结果:

id user_id profile_id   visit_date    visitorCount 
1 1    1   May, 10 2015 15:26:46   3 
+1

哦,_try this_是一个很好的解释:) – dbf

+0

让我们希望OP不使用MySQL版本> = 5.7.5,这会导致此查询失败,因为它依赖于在后续版本中已禁用的非标准行为。 – jpw

+1

@DyrandzFamador它在当前的通用可用版本中工作,尽管没有问题,但它可能在未来。本手册的相关部分供参考:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – jpw

1

LEFT JOIN到user_login表对此问题没有任何好处,但是,以下查询会为您提供想要查看的详细信息(假设您只想查看user_id = 1的访问次数):

SELECT COUNT(profile_visitors.profile_id) AS visitorCount 
FROM profile_visitors 
WHERE profile_visitors.user_id = 1 
GROUP BY profile_visitors.profile_id 

要查看配置文件使用的所有访问:

SELECT profile_id, COUNT(profile_visitors.profile_id) AS visitorCount 
FROM profile_visitors 
GROUP BY profile_visitors.profile_id 
+0

谢谢,你的snippit结合使用DISTINCT的jpw的snippit解决了这个问题。感谢eveybody的帮助! – GeenId