【问题标题】:SQL query - get rows from a table based on one condition and through join table based on another conditionSQL 查询 - 根据一个条件从表中获取行,并根据另一个条件通过连接表获取行
【发布时间】:2013-06-06 00:36:26
【问题描述】:

我有一个标签表 - 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

谢谢。

结构澄清编辑

【问题讨论】:

  • 您可以为您的表添加 DDL 吗?我很确定 user_tags 是一个桥接表。 tags.owner_id 是外键吗?更好地了解数据的关系会有所帮助。

标签: sql


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2013-07-23
    相关资源
    最近更新 更多