0

最初にテーブル 'posts' の 2 つのテーブルがあるクエリ ステートメントを求めています。

post_id     title    Userid
1           test     1

もう一方のテーブルは「いいね」です

userid  post_id
1       1

ユーザーがこの写真を気に入っているかどうかを確認するために、単一のクエリが必要です。私のソリューションは非常に貧弱です:

SELECT * FROM `table` WHERE x = x LIMIT 100;

foreach を指定し、すべての行に対してクエリを作成します。

foreach($results as $v)
{
   $data[1] = $v;
   $data[1]['is_like'] = SELECT COUNT(*) FROM likes WHERE userid = 1;
}

1 はすでにログインしているユーザー ID です

post_id などを返す単一のクエリが必要で、is_like のようにファイルされます

4

3 に答える 3

3

likes同じ (user_id,post_id) を持つ行が 1 つしかない場合:

SELECT p.* , 
CASE WHEN 
l.id IS NULL THEN 0
ELSE 1
END as is_liked
FROM posts p
LEFT JOIN likes l ON l.user_id = p.user_id and l.post_id =p.post_id

likesそうでない場合 (特定の (user_id,post_id) に対して複数の行) :

SELECT p.* , 
CASE WHEN 
l.user_id IS NULL THEN 0
ELSE 1
END as is_liked
FROM posts p
LEFT JOIN 
(
   SELECT DISTINCT user_id,post_id FROM likes 
) l ON l.user_id = p.user_id and l.post_id =p.post_id;

または

SELECT p.* , 
CASE 
WHEN  EXISTS (SELECT NULL FROM likes l 
  WHERE l.user_id = p.user_id and l.post_id =p.post_id) THEN 1
ELSE 0
END as is_liked
FROM posts p

更新 私は今、質問をよりよく理解できたと思います. 私の仮定:posts.user_id投稿を作成したユーザーのIDです。likeテーブルには、誰が投稿を気に入ったかに関する情報が格納されます。したがって、すべての投稿を確認し、特定の投稿が必要かどうかを確認するには ($login_user_id適切にエスケープする必要があります)。

SELECT p.* , 
CASE 
WHEN  EXISTS (SELECT NULL FROM likes l 
  WHERE l.user_id = $login_user_id and l.post_id =p.post_id) THEN 1
ELSE 0
END as is_liked
FROM posts p
于 2013-01-19T17:22:26.317 に答える
1
SELECT 
    p.post_id,
    p.title,
    IF(l.post_id IS NOT NULL,1,0) as like
FROM posts as p
LEFT JOIN likes as l ON l.post_id = p.post_id AND l.userid = p.userid
WHERE p.Userid = 1

likes テーブルの post_id が利用可能な場合は 1 が返され、それ以外の場合は 0 が返されます。

于 2013-01-19T18:13:25.093 に答える
0

このようなものは、単一のクエリとして機能するはずです (もちろん、テストされていません。テストに使用するデータはあまり提供されていません)。

select 
  p.title, count(l.post_id) 
from 
  `posts` p
inner join 
  `likes` l
on 
  l.userid = p.userid and l.post_id = p.post_id
where 
  p.userid = loggedinuserID
group by 
  p.userid

これにより、指定したユーザーが気に入った投稿の総数が表示されます。

于 2013-01-19T18:04:30.413 に答える