如何从1列中获取2个值

时间:2018-05-08 04:04:13

标签: mysql

我有2个表,我想从表1中的列中获取值,并在结果表的2个不同列中显示它。这是表格。

table1

id name email
1 | James | aaaa@a.com

2 | John |   bbbb@b.com

3 | Jack |   cccc@c.com

表2:

id name    xID yID
1 | Opqr  |  1  | 2

2 | Pqrs  |  2 |  3

3 | Qrst  |  3 |  1

4 | Rstu  |  2  | 1

现在我想得到像这样的结果

 name    xName   yName
Opqr  |  James  |  John    
Pqrs  |  John  |  Jack    
Qrst  |  Jack  |  James    
Rstu  |  John  |  James    

有两个条件,xName的table1.id = table2.xID和yName的table1.id = table2.yID。我如何得到结果?

我试过

select table2.name, table1.name as xName, table1.name as yName
 from table1 inner join table2
 on table1.id=table2.xid and table1.id=table2.yid

但它给了0行。我还在学习sql,并且很难理解连接章节。我不确定要搜索哪个关键字,所以如果这个问题在某个地方已经有了答案,请提供链接。谢谢。

4 个答案:

答案 0 :(得分:2)

这是另一个答案

SELECT t2.name, tx.name as xname, ty.name as yname
FROM t2
JOIN t1 AS tx
ON t2.xID = tx.id
JOIN t1 AS ty
ON t2.yID = ty.id;

即使名称来自同一个表,如果我们以面向对象的方式考虑这个,那么在t2中“交互”的名称将是两个对象之间的比较。我们需要将对象idxIDyID进行比较,然后打印出与匹配相关联的名称。这是一个很好的迹象,表明我们需要将对象表(t1)与自身连接起来,每个事物都要进行比较。

现在,回到SQL中,有几种方法可以做到这一点,你当然可以将这个表的交叉产品与自身结合起来,然后过滤掉你想要的东西。

这可能类似于

SELECT *
FROM t2, t1 x, t1 x;

这将给出每个组合(在此示例中为36行)

(如下所示)

| id | name | xID | yID | x.id | x.name | x.email    | y.id | y.name | y.email    |
|----+------+-----+-----+------+--------+------------+------+--------+------------|
|  1 | Opqr |   1 |   2 |    1 | James  | aaaa@a.com |    1 | James  | aaaa@a.com |
|  1 | Opqr |   1 |   2 |    1 | James  | aaaa@a.com |    2 | John   | bbbb@b.com |
|  1 | Opqr |   1 |   2 |    1 | James  | aaaa@a.com |    3 | Jack   | cccc@c.com |
|  1 | Opqr |   1 |   2 |    2 | John   | bbbb@b.com |    1 | James  | aaaa@a.com |

然后我们会筛选出与我们正在寻找的匹配的组合。

SELECT *
FROM t2, t1 x, t1 y
WHERE xID = x.id
AND yID = y.id;

这只会向我们提供我们正在寻找的所有可能行的行。

| id | name | xID | yID | x.id | x.name | x.email    | y.id | y.name | y.email    |
|----+------+-----+-----+------+--------+------------+------+--------+------------|
|  1 | Opqr |   1 |   2 |    1 | James  | aaaa@a.com |    2 | John   | bbbb@b.com |
|  2 | Pqrs |   2 |   3 |    2 | John   | bbbb@b.com |    3 | Jack   | cccc@c.com |
|  3 | Qrst |   3 |   1 |    4 | Jack   | cccc@c.com |    1 | James  | aaaa@a.com |
|  4 | Rstu |   2 |   1 |    2 | John   | bbbb@b.com |    1 | James  | aaaa@a.com |

我们正在寻找的行。现在只需在SELECT中过滤出您想要的列。或者我们可以清理一下。我们不需要WHERE条款。这正是联接中ON的用途。因此,我们将使用两个使用ON子句的JOIN替换表交叉产品,并将解决方案放在顶部。

答案 1 :(得分:0)

试试这个,

select t2.name,t1.name as xName, t3.name as yName
from table2 t2
     left join table1 t1 on t2.xid = t1.id
     left join table1 t3 on t2.yid = t3.id;

答案 2 :(得分:0)

几乎正确,第一个名字和第二个名字是不同的,所以你应该有2个连接,分别引用表1

select table2.name, A1.name as xName, B1.name as yName
 from table2 
inner join table1 A1 ON A1.id=table2.xid 
inner join table1 B1 ON B1.id=table2.yid

答案 3 :(得分:0)

SELECT T2.name, TX.name AS TX , TY.name AS TY FROM Table2 T2 
LEFT JOIN Table1 AS TX ON TX.id=T2.xid
LEFT JOIN Table1 AS TY ON TY.id=T2.yid

我已根据上述查询获得所需的输出,以下是答案

Opqr    James   John 
Pqrs    John    Jack 
Qrst    Jack    James
Rstu    John    James