2012-10-03 17 views
0

我在這裏得到的問題可能看起來很愚蠢,但是這讓我有點瘋狂,因爲我無法得到MySQL連接的工作方式。MySQL:如何組合從另一個表中多次引用的列並分配正確的別名?

我有2個表:

user; 
+--------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+--------------------+--------------+------+-----+---------+-------+ 
| id     | int(11)  | NO | PRI | NULL |  | 
| name    | varchar(128) | NO |  | NULL |  | 
+--------------------+--------------+------+-----+---------+-------+ 

game; 
+--------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+--------------------+--------------+------+-----+---------+-------+ 
| id     | int(11)  | NO | PRI | NULL |  | 
| source_id*   | int(11)  | NO |  | NULL |  | 
| target_id*   | int(11)  | NO |  | NULL |  | 
+--------------------+--------------+------+-----+---------+-------+ 

game.source_idgame.target_id是引用該user.id約束。

現在我想選擇game表中的所有內容,並且我想包含2個用戶的結果名稱,因爲game有2個用戶。我希望這些列的名稱具體爲target_namesource_name

嘗試這樣的查詢

SELECT 
    g.id, 
    u.name 
FROM 
    game g 
RIGHT JOIN 
    user u 
ON 
    u.id = g.source_id 
OR 
    u.id = g.target_id 
WHERE 
    g.source_id = 1 
OR 
    g.target_id = 1 
; 

但正如你可能已經注意到,我沒有別名u.nametarget_namesource_name,因爲我不知道該怎麼做,最終的結果看起來是這樣的:

+----+------+ 
| id | name | 
+----+------+ 
| 1 | bo | 
| 1 | al | 
| 2 | jo | 
| 2 | jay | 
+----+------+ 

正如你所看到的,在結果中出現了多個game

預期的結果:

+----+-------------+-------------+ 
| id | target_name | source_name | 
+----+-------------+-------------+ 
| 1 | bo   | al   | 
| 2 | jo   | jay   | 
+----+-------------+-------------+ 

在此先感謝。

回答

1

你需要加入表user兩次表game爲了獲得遊戲的兩個名字。我添加了COALESCE,因爲它對於顯示NULL列的描述性值很有用。例如,如果源或目標沒有值,則將顯示的值爲「-no value-」。

SELECT a.*, 
     COALESCE(b.name,'-no source-') sourceName, 
     COALESCE(c.name,'-no target-') targetName 
FROM game a 
     LEFT JOIN `user` b 
      on b.id = a.source_ID 
     LEFT JOIN `user` c 
      on on c.id = a.target_id 
-- your condition here 
+0

謝謝。這也起作用。這是否意味着每次連接都會通過'用戶表'運行兩次? –

+1

是的,但它會很快,因爲定義該關係的那些鍵已經是索引。 –

+0

感謝您對COALESCE的額外信息。但是,如果我添加了'WHERE'子句,那麼我不需要它(「COALESCE」),因爲如果沒有'source_id'或'target_id',遊戲就無法存在? –

1
SELECT 
    g.id, 
    source.name, 
    target.name 
FROM 
    game g 
LEFT JOIN 
    user source 
ON 
    source.id = g.source_id 
LEFT JOIN 
    user target 
ON 
    target.id = g.target_id 
WHERE 
    g.source_id = 1 
OR 
    g.target_id = 1 
; 

where子句是可選的,並且意在由搜索用戶ID = 1玩過的所有遊戲,如源或作爲靶。

+0

謝謝。它完成這項工作,我可以別名'source.name'和'target.name'。感謝您指出WHERE子句。在最終的應用程序中,我需要它,因爲這正是我需要做的 - 爲特定用戶獲取所有遊戲。 –

相關問題