Mysql在同一个表中引用2个外键引用相同的键

时间:2017-03-12 02:10:04

标签: mysql sql join innodb

我有以下两张表。

表:用户

user_id     username
--          --
1           name1
2           name2
3           name3

表:Rel

user1       user2
--          --
1           2
3           2
1           3

我的目标是像这样检索它:

user1       user2
--          --
name1       name2
name3       name2
name1       name3

请原谅我糟糕的术语和英语。 user1和user2是来自users.user_id的外键,它们一起构成一个复合键。

我可以获得一列如下

SELECT users.username
FROM users
JOIN rel ON rel.user1 = users.user_id

但是当我尝试将它们组合在一起时如上图所示,我无法让它完全正常工作。如果有人有任何建议我会非常感激

2 个答案:

答案 0 :(得分:1)

因此,如果您的架构是:

CREATE TABLE Users (user_id int, username varchar(50));
INSERT INTO Users (user_id, username) VALUES (1, 'name1');
INSERT INTO Users (user_id, username) VALUES (2, 'name2');
INSERT INTO Users (user_id, username) VALUES (3, 'name3');

CREATE TABLE Rel (user1 int, user2 int);
INSERT INTO Rel (user1, user2) VALUES (1, 2);
INSERT INTO Rel (user1, user2) VALUES (3, 2);
INSERT INTO Rel (user1, user2) VALUES (1, 3);

您可以使用以下查询:

SELECT u1.username as user1, u2.username as user2
FROM Rel r
JOIN Users u1 ON r.user1 = u1.user_id
JOIN Users u2 ON r.user2 = u2.user_id

- >

+---------+---------+
| user1   | user2   |
|---------+---------|
| name1   | name2   |
| name3   | name2   |
| name1   | name3   |
+---------+---------+
3 rows in set
Time: 0.002s

答案 1 :(得分:0)

你应该真的"只是尝试一下"在问之前。试试这个:

System.out.print(p + "\t" + q + "\t" + (p * q) + "\t");
if(p != q) System.out.println((p + q) + "\t" + (p + q) + "\t" + q);
if((p == q) & (p == 1)) System.out.println(p + "\t0\t0");
if((p == q) & (p == 0)) System.out.println(p + "\t0\t1");

需要注意的一个最重要的部分是你必须使用"表别名"区分第一个连接和第二个连接到同一个表。 " U1"和" u2"是我为这个例子选择的别名。