Php 查询中的COUNT()返回意外结果

Php 查询中的COUNT()返回意外结果,php,mysql,sql,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.ima

我正在创建一种类似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\u ID)
返回4,而
SUM(IF(likes.user\u ID=?,1,0))
也返回4

令人惊讶的是,这是喜欢的实际数量乘以我的朋友数量(4),我假设,因为一篇有2个喜欢的帖子显示为8个喜欢。昨天我有3个朋友,结果是3个。只有当这篇文章是我自己的时候才会发生

我使用了一个非常类似的查询来获取评论,但是没有发生任何奇怪的事情

有什么想法吗

编辑:这不仅仅局限于我自己的帖子。我刚刚在别人的帖子里找到了一个案例。然而,这并不是发生在每个帖子上。。。这很奇怪。而且,它不一定是我自己喜欢的


EDIT2:在“重温”我在EDIT1中提到的帖子时,它显示为一个,经过几次刷新后,它仍然显示为一个样子。奇怪..

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

好吧,我决定放弃这个,只需要寻找一个类似于我和@Duniyadnd在对我的问题的评论中描述的解决方案

我有一张桌子。它只包含一个ID。我添加了一个字段“likes”。并创建了两个触发器:一个用于newLike,另一个用于deletedLike,它将更新给定对象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
所以我清除了我的likes表以重新开始,但是allowLike(
SUM(IF(likes.user_ID=?,1,0))
)仍然返回4。在likes表中只有一个条目,我仍然很好奇为什么会出现这种情况?同样,我有4个朋友


或者我最好把这个问题放到一个新的问题中。

连接导致从一个表中的行与另一个表中的行的交叉连接创建多个中间行。因此,您的4个朋友将1 like转换为4个中间行,然后将其相加得到4的结果

尝试在第一个select中使用select,而不是所有连接,如对posts/comments/likes的查询:

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
(我将like.value作为1或-1作为赞成票和反对票)


希望这有帮助:)

这里不回答您的问题,但考虑到您查询的复杂性,而且您提到这是针对社交媒体网站的,因此我建议缓存所有“喜欢”的内容。并不是每个人都真正需要实时数据来记录什么时候通过这个查询被喜欢。起初我确实使用了一个触发器,但最近我改变了我的表结构,使得使用触发器变得非常复杂甚至不可能。除非我对所有物体都使用触发器。(我有一个主表和对象,我在其中生成一个ID,并在创建新对象(照片、帖子等)时使用它。我可以只向每个对象添加一个likes列,并对我拥有的每个对象使用触发器(Like SET likes=likes+1 WHERE posts.object\u ID=NEW.object\u ID;SET likes=likes+1 WHERE images.object\u ID=NEW.object\u ID;等等等等。这会起作用,但扩展起来很痛苦。你认为这样更好吗?上面的方法会在删除对象时产生问题,迫使我使用全局mysql变量。它没有那么优雅。但可能。我不这么认为情况就是这样,因为我成功地使用了不同的WHERE子句,例如:
$str=“posts.group_ID='?”;
,这给了我相同的奇怪偏移量。