【问题标题】:SQL select two rows from same table (same column, in fact), based on join with other tableSQL 从同一个表(实际上是同一列)中选择两行,基于与其他表的连接
【发布时间】:2016-10-07 20:38:02
【问题描述】:

我有两张桌子:votessubmissionsvotes 存储所有收到的选票(每个人可以投第一票和第二票),submissions 保存人们可以投票的项目。每个项目都有自己的 ID。 votes 表存储每个投票的 ID。我想检索人们投票的项目的名称。下面是表格的示例:

votes:

**voter** | **vote1_ID** | **vote2_ID**
   Foo    |       1      |       2
   Bar    |       3      |       2
   Mark   |       2      |       3

submissions:

**ID** | **name**
   1   |   John
   2   |   Jane
   3   |   Mary

我已经说过我想在一个查询中检索与第一次投票相关联的名称和与第二次投票相关联的名称(事实上,我并不关心它需要多少次查询,但一个查询是当然总是更好更干净)。我将如何继续这样做?我已经尝试过认为我需要使用连接,但我不知道如何从同一列中检索两次值。

编辑:我想举个例子说明我尝试执行的查询可能有用:

例如,如果我想查看 Bar 投票给了什么,那么查询的结果应该是两次 submits.name。在 Mark 的结果中,这是 Jane 和 Mary。

【问题讨论】:

    标签: sql join


    【解决方案1】:

    您可以执行两个内部连接来选择单独的值。

    SELECT s1.name, s2.name 
    FROM votes v
    INNER JOIN submissions s1 ON v.vote1_ID = s1.ID
    INNER JOIN submissions s2 ON v.vote2_ID = s2.ID
    

    【讨论】:

      【解决方案2】:

      你必须join提交表两次才能得到预期的结果。

      select v.voter, s1.name, s2.name 
      from votes v 
      join submissions s1 on v.vote1_id = s1.id
      join submissions s2 on v.vote2_id = s2.id
      

      【讨论】:

      • 我不一定需要 v.voter。这是您构建查询的方式所必需的吗?
      • no..如果您不需要它,可以将其从select 中删除。
      • 这感觉有点违反直觉。
      【解决方案3】:

      如果你想要行而不是列,你可以做两个连接并将它们联合在一起:

      select v.voter, s1.name
      from votes v 
      join submissions s1 on v.vote1_id = s1.id
      UNION ALL
      select v.voter, s2.name
      from votes v 
      join submissions s2 on v.vote2_id = s2.id
      

      【讨论】:

        猜你喜欢
        • 2021-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 2011-12-26
        • 2020-08-17
        • 2020-03-21
        相关资源
        最近更新 更多