SQL 从同一个表(实际上是同一列)中选择两行,基于与其他表的连接

Posted

技术标签:

【中文标题】SQL 从同一个表(实际上是同一列)中选择两行,基于与其他表的连接【英文标题】:SQL select two rows from same table (same column, in fact), based on join with other table 【发布时间】: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。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于SQL 从同一个表(实际上是同一列)中选择两行,基于与其他表的连接的主要内容,如果未能解决你的问题,请参考以下文章

从同一个表的两个不同列中选择不同的值

从同一个表中的多个列中选择不同的值

SQL如何使用同一列中的值之间匹配2个表

组合 SQL 中同一列中的行

SQL如何使用同一列中的值匹配2个表

在 SQL 中排序时如何比较同一表中的两行?