2009-09-12 27 views
5

我有一個項目表,其中有兩個用戶外鍵(user_id和winner_user_id),一個用於項目所有者,另一個用於項目獲勝者。像SQL,如何查詢表中的多個外鍵?

+----------------+-------------------------+------+-----+---------+----------------+ 
| Field   | Type     | Null | Key | Default | Extra   | 
+----------------+-------------------------+------+-----+---------+----------------+ 
| project_id  | int(10) unsigned  | NO | PRI | NULL | auto_increment | 
| start_time  | datetime    | NO |  | NULL |    | 
| end_time  | datetime    | NO |  | NULL |    | 
| title   | varchar(60)    | NO |  | NULL |    | 
| description | varchar(1000)   | NO |  | NULL |    | 
| user_id  | int(11)     | NO |  | NULL |    | 
| winner_user_id | int(10) unsigned  | YES |  | NULL |    | 
| type   | enum('fixed','auction') | YES |  | NULL |    | 
| budget   | decimal(10,0)   | YES |  | NULL |    | 
+----------------+-------------------------+------+-----+---------+----------------+ 

東西現在我想在一個單一的查詢來獲取關於關於兩個用戶的項目和數據信息。

所以我喜歡制定

SELECT projects.project_id, projects.title, projects.start_time, 
      projects.description, projects.user_id, projects.winner_user_id, 
      users.username as owner, users.username as winner 
     FROM projects,users 
     WHERE projects.user_id=users.user_id 
     AND projects.winner_user_id=users.user_id 

這顯然會返回一個空集的查詢。真正的問題是我如何引用這些不同的user_id。我甚至嘗試使用AS關鍵字,然後使用我在相同的SQL查詢中創建的名稱,但顯然這不起作用。

爲了使事情變得清楚到底,我想是這樣

+------------+-------------------------------------------------+---------------------+---------+----------------+--------------+--------------+ 
| project_id | title           | start_time   | user_id | winner_user_id | owner  | winner  | 
+------------+-------------------------------------------------+---------------------+---------+----------------+--------------+--------------+ 
|   1 | CSS HTML Tableless expert for site redesign  | 2009-09-01 21:07:26 |  1 |    3 | mr X  | mr Y  | 
|   2 | High Quality Ecommerce 3-Page Design HTML & CSS | 2009-09-01 21:10:04 |  1 |    0 | mr X  | mr Z  | 

我如何構建一個查詢來處理呢?

在此先感謝。

回答

8

您已經很近了,但您需要兩次加入用戶表,一次加入所有者,一次加入贏家。使用表別名來區分這兩者。

SELECT 
     projects.project_id 
    , projects.title 
    , projects.start_time 
    , projects.description 
    , projects.user_id 
    , projects.winner_user_id 
    , users.username as owner 
    , winnerUser.username as winner 
FROM projects 
INNER 
    JOIN users 
    ON projects.user_id=users.user_id 
INNER 
    JOIN users winnerUser 
    ON projects.winner_user_id=winnerUser.user_id 
+0

非常感謝!我從來沒有真正使用過INNER JOIN語法,但是我發現有趣的是,在USER之後沒有直接指定winnerUser。 – zenna 2009-09-12 17:30:41

2
SELECT ... FROM users AS winers, users AS owners 
WHERE projects.user_id=owners.user_id 
     AND projects.winner_user_id=winners.user_id 
1

關於使用這樣的事情是什麼:

SELECT projects.project_id, projects.title, projects.start_time, 
    projects.description, projects.user_id, projects.winner_user_id, 
    user_owner.username as owner, user_winner.username as winner 
FROM projects 
    inner join users user_owner on user_owner.user_id = projects.user_id 
    inner join users user_winner on user_winner.user_id = projects.winner_user_id 

你先有項目,那麼你內部連接的所有者(使用一個特定的別名),然後內部聯接對獲勝者(使用另一個特定的別名)

而且,在select子句中,您可以使用這些別名來獲取所需的信息 - 如果您需要限制where子句中的任何內容,則也是如此。

注意:如果您還想要還沒有贏家的項目,您可能需要使用左連接而不是內連接。

0
SELECT u1.user_id AS user_id, u2.user_id AS AS winner_id 
FROM projects p 
    INNER JOIN users u1 ON p.user_id=u1.user_id 
    INNER JOIN users u2 ON p.winner_user_id=u2.user_id 
0

這應該工作,並返回NULL,如果在未知的贏家(當winner_user_id爲null)

SELECT projects.project_id, 
    projects.title, 
    projects.start_time, 
    projects.description, 
    projects.user_id, 
    projects.winner_user_id, 
users_owner.username as owner, 
users_winner.username as winner 
FROM projects 
    INNER JOIN users AS users_owner ON users_owner.user_id = projects.user_id 
    LEFT OUTER JOIN users AS users_winner ON users_winner.user_id = projects.winner_user_id