使用两个表计算每个用户的喜好

时间:2016-07-10 01:56:45

标签: mysql

我有两个表,第一个是POSTS,有三个字段(post_iduser_idtext)第二个表是LIKES两个字段(user_idpost_idlikes.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新手,请原谅任何错误!谢谢你的帮助!

1 个答案:

答案 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样式的连接语法,这种语法更具体,更易于维护。