0

更新

sqfiddle中有一个数据库模型:http ://sqlfiddle.com/#!2/8dbb0/10

我根据注释更新了问题。

原帖 我有三个表:

发布
标签
tag_to_post

让我们假设用户 2 已使用 tag_id 1。现在我想向用户 2 显示所有帖子,另一个用户已用 tag_id 1 标记,但用户 2 到目前为止尚未用 tag_id 1 标记。

查询:

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  

所以应该只剩下post 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 回答