我有两个表,第一个是POSTS
,有三个字段(post_id
,user_id
,text
)第二个表是LIKES
两个字段(user_id
,post_id
)likes.user_id
是喜欢该帖子的用户的ID。
现在我想查询数据库并获得每个用户对另一个用户的喜欢(距离)的计数。意思是我得到三个字段的结果,四个带索引(我现在不太担心它):
User 1 | User 2 | count(INT) | index
-------------------------------------
User_a | User_b | 45 | ab
User_c | User_n | 53 | cn
User_b | User_a | 38 | ba
我尝试使用这样的东西,但我并不总是得到准确数量的喜欢。此外,我正在获得一些数据冗余。
SELECT likes.user_id, posts.user_id,
COUNT(likes.post_id)
from posts, likes
WHERE posts.post_id = likes.post_id
GROUP BY posts.user_id
ORDER BY COUNT(likes.post_id)
我是MySQL新手,请原谅任何错误!谢谢你的帮助!
答案 0 :(得分:1)
SELECT likes.user_id, posts.user_id,
COUNT(DISTINCT likes.post_id) --<<changed
from posts
INNER JOIN likes ON posts.post_id = likes.post_id --<<changed
GROUP BY likes.user_id, posts.user_id --<<changed
ORDER BY COUNT(DISTINCT likes.post_id) --<<changed
我怀疑&#34;数据冗余&#34;可能来自你的group by子句。虽然MySQL确实允许您编写本条款中不符合SQL标准的查询,但始终指定所有非聚合列非常重要。 (有关MySQL允许的非标准语法的详细信息,请参阅https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html。)
另一项更改是在count函数中使用DISTINCT。如果不能访问您的表格,我不知道是否需要,但它可以解决您说的准确性问题。
最后。请停止使用逗号分隔的表列表作为from子句。这不再是一种好的做法,您应该遵循ANSI样式的连接语法,这种语法更具体,更易于维护。