1

私は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:EDIT1で話していた投稿を「いいね」すると、1つとして表示され、2、3回更新した後も、1のように表示されました。変..

4

3 に答える 3

0

さて、私はこれをあきらめて、私の質問へのコメントで私と@Duniyadndによって説明されたものと同様の解決策を選ぶことにしました。

テーブルオブジェクトがあります。IDのみが含まれていました。「いいね」フィールドを追加しました。そして、2つのトリガーを作成しました。1つはnewLike用で、もう1つは指定されたobject_IDのlikes列を更新するdeletedLike用です。

今私のクエリはそのようなものです:

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を返します。いいねテーブルにはエントリが1つしかないのですが、なぜこれが起こっているのか興味がありますか?繰り返しますが、私には4人の友達がいます。

それとも、これを新しい質問に入れたほうがいいでしょうか。

于 2013-02-13T10:52:38.080 に答える
0

問題は WHERE 句に関連している可能性があります。パラメータは解析されません。WHERE は単なる長い varchar であり、RDMS はこれを TRUE と解釈しています。

于 2013-02-13T10:09:23.887 に答える
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であるlike.valueがあります)

それが役立つことを願っています:)

于 2013-05-29T21:43:49.107 に答える