2012-08-14 69 views
1

我有其中包含两个外键的物品表中的MySQL数据库:指向同一个表的多个外键 - 歧义问题

  • fk_id_user_created
  • fk_id_user_edited

用户表看起来像此

  • pk_id_user
  • 用户名

如何连接这些表,这样就可以返回创建和编辑文章的用户的用户名了?有明显的歧义问题...

编辑:这显然是行不通的:

SELECT 
    articles.title, 
    articles.article, 
    users.username as created_by, 
    users_username as edited_by 
FROM 
    articles 
LEFT JOIN 
    users 
ON 
    articles.fk_id_user_created = users.pk_id_username 
LEFT JOIN 
    users 
ON 
    articles.fk_id_user_edited = users.pk_id_username 
+0

“编辑:这不显然是不行的” - 是正确的,但如果你将工作别名'users'的情况下, 。看到我的答案。 – 2012-08-14 00:56:28

回答

0

你的意思是这样的,如果我理解正确么?

CREATE TABLE USER (
user_id INTEGER PRIMARY KEY AUTO_INCREMENT, 
username VARCHAR(255) 
); 

INSERT INTO USER (username) VALUES 
('A'), ('B'); 

CREATE TABLE article (
id INTEGER PRIMARY KEY AUTO_INCREMENT, 
user_id_created INTEGER, 
user_id_edited INTEGER 
); 

INSERT INTO article (user_id_created, user_id_edited) 
VALUES (1, 1), (2,1); 

SELECT username 
FROM USER 
WHERE user_id IN (SELECT user_id_created FROM article WHERE user_id_created=user_id_edited); 

DROP TABLE USER; 
DROP TABLE article; 

而我没有使用连接,我只是假设user_id_created和user_id_edited将是相同的。

+0

不,一篇文章可以由一个用户创建并由另一个用户编辑。当文章创建时,pk_id_user_edited是NULL。只有在编辑完成后,才会填充执行编辑的用户的用户标识。 – user1440560 2012-08-14 00:48:08

4

articles加入users两倍,提供了一个别名来区分实例:

select 
    articles.whatever, 
    created.username as created_username, 
    edited.username as edited_username 
from 
    articles 
    inner join users as created on articles.fk_id_user_created = created.pk_id_user 
    inner join users as edited on articles.fk_id_user_edited = edited.pk_id_user 
; 
+0

经过测试和工作。非常感谢! – user1440560 2012-08-14 00:57:59