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 【问题描述】:我有两张桌子:votes
和 submissions
。 votes
存储所有收到的选票(每个人可以投第一票和第二票),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 从同一个表(实际上是同一列)中选择两行,基于与其他表的连接的主要内容,如果未能解决你的问题,请参考以下文章