COUNT()喜欢查询返回意外结果

时间:2013-02-13 06:32:19

标签: php mysql sql

我正在创建某种像facebook这样的社交媒体,而我正在尝试使用以下查询来获取帖子的数量。

SELECT posts.object_ID, posts.user_ID, posts.datetime, posts.text, 
    COUNT(likes.object_ID) AS likes, 
    SUM(IF(likes.user_ID=?, 1, 0)) AS allowLike, users.first_name, 
    users.last_name, userinfo.image_ID 
FROM posts 
LEFT JOIN users ON users.ID=posts.user_ID 
LEFT JOIN friends ON (friends.user_ID_1=? OR friends.user_ID_2=?) 
    AND friends.approved=1 
LEFT JOIN userinfo ON users.ID=userinfo.user_ID 
LEFT JOIN likes ON likes.object_ID=posts.object_ID 
WHERE ". $str ." 
GROUP BY posts.object_ID 
ORDER BY posts.datetime DESC 
LIMIT 0,30

$str的价值只是过滤朋友和东西的机制,例如:

$str = "(posts.user_ID=friends.user_ID_1 OR posts.user_ID=friends.user_ID_2) OR posts.user_ID=? ";

现在发生的事情是COUNT(likes.object_ID)返回4而SUM(IF(likes.user_ID=?, 1, 0))也返回4.

令人惊讶的是,实际的喜欢数量乘以我拥有的朋友数量(4),我认为,因为有2个喜欢的帖子显示为8个喜欢。昨天我有3个朋友,它显示为3.而且只有在帖子是我自己的时候才会发生。

我使用一个非常相似的查询来获取评论,但那里没有什么奇怪的事情发生。

有什么想法吗?

编辑:这不仅限于我自己的帖子。我刚刚发现了一个案例,它出现在别人的帖子中。不过,每个帖子都没有发生......这很奇怪。此外,它不受我自己的喜欢......

EDIT2:在'reliking'上我在EDIT1中讲述的帖子时,它显示为一个,经过几次刷新后它仍然显示为1。怪异..

3 个答案:

答案 0 :(得分:0)

您的问题可能与您的WHERE子句有关。不解析参数;你的WHERE只是一个长varchar,你的RDMS将其解释为TRUE。

答案 1 :(得分:0)

好吧,我决定放弃这个,只是在我的问题评论中找到类似于我自己和@Duniyadnd描述的解决方案。

我有一个表对象。它只包含一个ID。我添加了一个字段'喜欢'。并创建了两个触发器:一个用于newLike,另一个用于deletedLike,它将更新给定object_ID的likes列。

现在我的查询是这样的:

SELECT 
    posts.object_ID, posts.user_ID, posts.datetime, posts.text, objects.likes, 
SUM(IF(likes.user_ID=?, 1, 0)) AS allowLike, users.first_name, users.last_name,   
    userinfo.image_ID 
FROM posts 
LEFT JOIN users ON users.ID=posts.user_ID 
LEFT JOIN friends ON (friends.user_ID_1=? OR friends.user_ID_2=?) AND friends.approved=1 
LEFT JOIN userinfo ON users.ID=userinfo.user_ID 
LEFT JOIN objects ON objects.ID=posts.object_ID 
LEFT JOIN likes ON likes.object_ID=posts.object_ID 
WHERE ". $str ." 
GROUP BY posts.object_ID ORDER BY posts.datetime DESC LIMIT 0,30

所以我清除了我喜欢的表,但是,allowLike(SUM(IF(likes.user_ID=?, 1, 0)))仍然返回4.在likes表中只有一个条目,我仍然很好奇为什么这是hapenning?我又有4个朋友。

或者我最好把它放在一个新问题中。

答案 2 :(得分:0)

连接导致从一个表中的行与另一个表的行的交叉连接创建多个中间行。因此,你的4个朋友正在使1喜欢变成4个中间行,然后总结得到4的结果。

而不是所有联接,请尝试在第一个选择中使用选择,例如对帖子/评论/喜欢的此查询:

select postid, postmessage,
 (select count(commentid) from comment where post.postid = comment.postid) as numcomments,
 (select sum(value) from like where post.postid = like.postid) as popularity
from post
group by postid

(我喜欢。值为1或-1作为向上投票和向下投票)

希望有所帮助:)