2014-09-02 62 views
0

我使用MySQL和MyISAM引擎。比方说,我有以下2数据库表:带有2个FK的表指向同一个表

的TableX

ID, Person1ID, Person2ID 

ID, Name 

我的查询应该怎么样子,因为我有2个外键指向同一个表? 我一直在试图加入表,但运气不好......

我想选择

ID, Name, Name 

回答

3

您需要在您的情况下加入Person表两次,这里有一个例子:

SELECT j.ID, 
     p.Name AS `Person 1 Name`, 
     p2.Name AS `Person 2 Name` 
    FROM TableX j 
    JOIN Person p 
    ON p.ID = j.Person1ID 
    JOIN Person p2 
    ON p2.ID = j.Person2ID 
+0

+1。这是返回指定结果的查询的一个很好的例子。 (如果在Person表中找不到匹配的行,可能会很好,如果在Person表中找不到匹配的行,则不会返回TableX中的行;实现“外部”连接将允许返回TableX中的行以及NULL值对于没有找到匹配行的名称) – spencer7593 2014-09-02 22:20:30

+0

稍微好一点的措辞是'它将返回表中存在的所有行Person对于这两个id的引用,如果缺少它,它将不会产生该特定行的任何结果。 ' – Prix 2014-09-02 22:22:04

+0

谢谢你们。我的错误是我没有使用Alias ......现在感觉很蠢......谢谢大家。 – BadgeWorker 2014-09-02 22:31:41

1

下面是执行JOIN操作来检索Person表的相关行的查询的例子:

SELECT t.ID 
    , t.Person1ID 
    , t.Person2ID 
    , p1.ID   AS `p1_ID` 
    , p1.Name  AS `p1_Name` 
    , p2.ID   AS `p2_ID` 
    , p2.Name  AS `p2_Name` 
FROM TableX t 
LEFT 
JOIN Person p1 
    ON p1.ID = t.Person1ID 
LEFT 
JOIN Person p2 
    ON p2.ID = t.Person2ID 
ORDER BY t.ID 

如果要排除Person表中没有匹配行的行,可以删除LEFT关键字以用“内部”连接替换“外部”连接操作。