SQL查询 - 根据一个条件从表中获取行,并根据另一个条件通过连接表获取行

时间:2013-06-06 00:36:27

标签: sql

我有一个标签表 - id,name,owner_id(owner_id是用户的FK)

和user_tags表 - user_id,tag_id(用户之间链接表格以便共享这些标签 - 即可以访问标签但不是所有者的用户)

我有一个查询可以通过user_tags表上的连接获取标签:

SELECT tags . * 
FROM tags
JOIN user_tags ON user_tags.user_id =2
AND user_tags.tag_id = tags.id
LIMIT 0 , 30

但是在同一个查询中,我还想选择标签WHERE tags.owner_id = 2,通过链接表(user_tags)获取与该用户共享的所有标签以及用户拥有的标签(tags.owner_id = user_id)

如果我在连接后包含WHERE tags.owner_id = 2,它只返回tags.owner_id = 2的结果。

如果我包含OR tags.owner_id = 2,我会重复所有结果。

如果我发表声明SELECT DISTINCT... OR tags.owner_id = 2我最终得到了正确的结果集,但我不确定这是以条件连接的正确方法。

有更好的方法/最佳做法吗?

另外,为什么连接会返回结果的倍数(即为什么需要SELECT DISTINCTGROUP BY

谢谢。

编辑结构澄清

1 个答案:

答案 0 :(得分:1)

我不会将user_tags.user_id用作连接条件的一部分。只需在where子句中指定两个条件,以使您的意图更清晰。但是要回答你的问题,是的,如果一个tags.id可以与许多user_tags.tag_id

相关联,你需要使用DISTINCT对标签进行重复数据删除。
SELECT DISTINCT tags.*
FROM tags
JOIN user_tags ON tags.id = user_tags.tag_id
WHERE user_tags.user_id = 2
OR user_tags.owner_id = 2
LIMIT 0,30