2012-08-14 45 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