我有两个表,第一个是 POSTS
,它具有三个字段(post_id
、user_id
、text
) >) 第二个表是 LIKES
有两个字段 (user_id
, post_id
) likes.user_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菜鸟,所以请原谅任何错误!,感谢您的帮助!
最佳答案
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
我怀疑“数据冗余”可能来自您的 group by 子句。虽然 MySQL 确实允许您在此子句中编写不符合 SQL 标准的查询,但始终指定所有非聚合列非常重要。 (有关 MySQL 允许但不应使用的非标准语法的详细信息,请参阅 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html。)
另一项更改是在计数函数中使用 DISTINCT。如果无法访问您的表格,我不知道是否需要这样做,但它可以解决您所说的准确性问题。
最后。请停止使用逗号分隔的表列表作为 from 子句。这不再是一个好的做法,您应该遵循 ANSI 风格的连接语法,它更具体且更易于维护。关于mysql - 使用两个表计算每个用户的点赞数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38287909/