【问题标题】:How to join either one of two tables that both share a column, and then continue joining?如何加入共享列的两个表中的任何一个,然后继续加入?
【发布时间】:2014-07-24 02:04:16
【问题描述】:

假设一个用户可以有两种帖子,一个自我帖子和外部链接帖子。 两种类型都有自己的表格。每个帖子可以有多个标签。现在我正在寻找一个查询,它给我一个列表 a) 在过去 X 天内在帖子中使用的标签和 b) 制作这些标签的用户(以便向他们发送电子邮件。

这是我目前所拥有的:

SELECT users.name, users.email, tags.name
FROM users
LEFT JOIN self_posts ON users.id = self_posts.user_id AND self_posts.date < x
LEFT JOIN ext_posts ON users.id = ext_posts.user_id AND ext_posts.date < x
WHERE NOT NULL coalesce(self_posts.id, ext_posts.id)
INNER JOIN tags on ~~either self_posts/ext_posts~~.tag_id = tag.id

如您所见,我不确定如何使内部连接使用两个表中的任何一个来连接标记表。我需要对左连接使用子查询吗?

注意:我的实际查询比这更复杂,需要更多后续连接。我只是在说明问题。

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    为什么不先得到两个表的并集:

    SELECT users.name, users.email, tags.name
    FROM users
    join (
      select *
      from self_posts a
      where a.date < x
      union all
      select *
      from ext_posts a
      where a.date < x) a a.user_id = users.id
    INNER JOIN tags on a.tag_id = tag.id
    

    【讨论】:

    • 感谢您的帮助。您选择 UNION ALL 而不是普通的 Union 是否有特殊原因?为什么我需要重复的行?
    • @user371699。由于 2 个表存储不同类型的帖子,我假设没有重复。如果不是这样,则使用union,否则union all 更快。
    • 如果我不需要自己使用实际的帖子,而我只是“通过”这些表格怎么办?换句话说,如果我只为 UNIONS 选择 user_idtag_id 列,是否会出现需要重复项的情况?
    • @user371699,您何时需要计算包含重复的帖子?
    • 好点,没想过这样的事情。非常感谢您的帮助! (旁注:我似乎无法在 cmets 中输入“@Fabricator”来提及您。)
    【解决方案2】:

    我不确定 mySQL 是否支持这个,但这对你有用吗?

    INNER JOIN tags on self_posts.tag_id = tag.id or external_posts.tag_id = tag.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2014-11-22
      • 1970-01-01
      • 2022-01-18
      • 2021-08-19
      • 2019-01-20
      • 2018-05-20
      相关资源
      最近更新 更多