2009-11-02 43 views
0

我在理解MYSQL連接語法時遇到了問題。我似乎無法爲我的目的操縱它。我不得不在工作中使用幾個月,這導致額外的查詢只是爲了檢索一個額外的列。MySQL加入語法

場景:我有兩個表..

Table.Stories - 包含故事和其中的人加入它的用戶ID。

ID,故事,用戶ID

Table.Users - 包含用戶信息和用戶ID

ID,用戶名

我想找回的故事表包括用戶id以及一個新的列(它是在我猜的動態生成的)稱爲用戶名,其中包含相應的用戶名Table.Users

我猜我會使用ASLEFT JOIN語法的混合。但我真的不知道了..

+0

也請提供您嘗試的查詢 – DVK 2009-11-02 21:34:39

+0

我的大部分嘗試都會導致錯誤。那些曾經工作過的人把兩張桌子結合起來,給了我一堆「不必要的專欄」。我只想從Table.Users獲得一個新的用戶名列。 – SyntaxError 2009-11-02 21:37:55

+0

嘗試看起來有點類似於此。 SELECT * FROM'stories' LEFT JOIN users on stories.id = siteusers.id AS用戶名 請原諒我可笑的語法。 – SyntaxError 2009-11-02 21:41:07

回答

3
SELECT s.id, s.story, s.userid, u.username FROM stories AS s INNER JOIN users AS u ON s.userid=u.id 

下面的解釋。

+0

假設每個故事都有一個用戶,則不需要進行LEFT JOIN。 INNER JOIN要求在JOIN的每個「側」的表中有一行,而如果沒有與ON條件相匹配的行,則LEFT JOIN僅爲第二個表中的每個列返回NULL值。 – Franz 2009-11-02 21:37:44

1

下面的查詢將幫助您:

SELECT s.story, u.username FROM Stories s 
LEFT JOIN Users u ON (u.id=s.userid) 

它返回一個故事記錄story領域和相應的用戶username的價值。

+0

由於使用了LEFT JOIN,'u.username'可能是'NULL' ... – 2009-11-02 21:36:22

+0

是的,但null有什麼問題? – 2009-11-02 21:37:40

0

這應該工作:

SELECT s.id, s.story, u.username 
FROM stories s 
INNER JOIN users u 
ON u.id = s.userid 

這基本上說:「給我講故事的ID,故事的名字,並從故事表的用戶,從用戶表中查找用戶名,其中用戶表ID匹配故事表的用戶標識符。「♦

0
SELECT st.*, COALESCE(u.username, 'unknown') AS username 
FROM Table.Stores st 
LEFT JOIN Table.Users u ON st.userid = u.id 

真的很簡單;確保你在Table.users中有一個id索引。 COALESCE函數返回非空的第一個參數,因此您可以爲沒有找到用戶的故事定義值。

如果你只在具有相應的用戶故事感興趣,然後用

SELECT st.*, u.username 
FROM Table.Stores st 
JOIN Table.Users u ON st.userid = u.id 

內部聯接是隱含在這裏,並不需要指定。

0

select stories。*,Users.username from stories inner join Users On Stories.userid = Users。ID

OR

SELECT * FROM故事內連接使用(用戶ID)的用戶(如果你保持一致的ID列)

0

如果總是有一個一對一的關係,即每個故事總是有用戶,那麼你應該使用一個內連接:

select t.id, t.story, t.userid, u.username 
from Table.Stories t 
inner join Table.Users u on u.id = t.userid 

如果用戶ID字段可以爲空,表明一個故事可以有一個用戶或沒有,你應該使用左連接:

select t.id, t.story, t.userid, u.username 
from Table.Stories t 
left join Table.Users u on u.id = t.userid 

對於沒有用戶的故事記錄,用戶名字段將返回爲空。