0

アップデート

sqfiddle にはデータベース モデルがあります: http://sqlfiddle.com/#!2/8dbb0/10

そして、注釈に従って質問を更新しました。

元の投稿 3 つのテーブルがあります。

投稿
タグ
tag_to_post

ユーザー 2 によって使用された tag_id 1 を仮定します。ここで、別のユーザーが tag_id 1 でタグ付けしたものの、ユーザー 2 はまだ tag_id 1 でタグ付けしていないすべての投稿をユーザー 2 に表示したいと考えています。

クエリ:

SELECT posts.id AS post_id, tags.id AS tag_id, tag_to_post.user_id AS 
user_tagged_post  
FROM posts  
LEFT JOIN tag_to_post ON tag_to_post.post_id = posts.id  
LEFT JOIN tags ON tags.id = tag_to_post.tag_id  
WHERE tags.id =1

次のようなものを生成します。

post_id | tags_id | user_tagged_post  
1      | 1       | 1  
1      | 1       | 2  
2      | 1       | 2  
3      | 1       | 1  

したがって、投稿ID 3のみが残るはずです。

最初に、次のような where ステートメントで試しました。

WHERE tags.id = 1 AND tag_to_post.user_id != '2'

しかし、これはもちろん、重複しているため、post_id 1 を除外するものではありません。WHERE 句の前に DISTINCT または GROUPED BY があるべきだと思いますが、これは許可されていないようです。唯一の方法はサブクエリですか?これまで解決策が見つかりませんでした。何か案は?

4

2 に答える 2

1

私があなたを正しく理解していれば、それは簡単なことのように思えLEFT JOINます。

SELECT t1.post_id, p.title, t1.tag_id, t1.user_id 
FROM tag_to_post t1
JOIN posts p ON t1.post_id = p.id
LEFT JOIN tag_to_post t2
  ON t1.tag_id  = t2.tag_id AND t1.post_id = t2.post_id AND t2.user_id = 2
WHERE t1.user_id <> 2 AND t2.user_id IS NULL

でテストする SQLfiddle

于 2013-06-18T06:11:19.137 に答える
0

このようなものが必要かもしれません

SELECT posts.id, posts.title, tags.tag, tag_to_post.user_id
FROM posts 
INNER JOIN tag_to_post ON tag_to_post.post_id = posts.id 
INNER JOIN tags ON tags.id = tag_to_post.tag_id 
WHERE tags.id = 1 AND tag_to_post.user_id <> 2

コメントに基づく:

SELECT DISTINCT posts.id, posts.title, tags.tag, A.user_id
FROM posts 
INNER JOIN tag_to_post A ON A.post_id = posts.id 
INNER JOIN tags ON tags.id = A.tag_id 
WHERE tags.id = 1
AND A.post_id NOT IN (SELECT post_id FROM tag_to_post WHERE tags.id = 1 AND user_id = 2)
于 2013-06-17T23:24:26.083 に答える