2012-07-19 33 views
0

我有一個包含消息的數據庫。消息存儲在一個表中,用戶信息存儲在另一個表中。在消息表中,有一個author_id列表示用戶表中作者的user_id,所有消息列,並且有一個to_address表示來自用戶表的「u_」+ user_id的串聯。是否有任何我可以加入這兩個表,以便它顯示用戶名,而不是ID在author_id和to_address。在2列上加入mysql表兩次= 1列

我已經試過

SELECT username, ..., username 
    FROM msgs 
    INNER JOIN users 
     ON user_id=author_id AND concat("u_",user_id)=to_address; 

有明顯的錯誤 我使用子查詢,如

SELECT 
    (SELECT username 
     FROM users 
     INNER JOIN msgs 
      ON user_id=author_id 
) AS "From", 
    (SELECT username 
     FROM users 
     INNER JOIN msgs 
      ON CONCAT("u_",user_id)=to_address 
) AS "To", 
    (SELECT timestamp(message_time) FROM msgs 
) AS "Sent", 
    (SELECT message_subject FROM msgs 
) AS "Subject", 
    (SELECT message_text AS "Message" FROM msgs 
) AS "Message" 

嘗試,並獲得 「子查詢返回多個1行」。有什麼方法可以成功地做到這一點嗎?

+0

感謝您的編輯。我正在研究這個。不用說,我對StackOverflow不是很熟悉。 – 2012-07-19 19:23:06

+0

請注意,您可以[將行格式化爲代碼](http://meta.stackexchange.com/questions/22186/)縮進四個空格。編輯器工具欄中的「{}」按鈕可以爲您做到這一點。單擊編輯器工具欄中的橙色問號以獲取更多信息和格式化提示。在使用某些東西之前閱讀幫助是非常有用的。 – outis 2012-07-20 01:54:20

回答

1

這聽起來像你想是這樣的:

SELECT 
    from_user.username AS "From", 
    to_user.username AS "To", 
    timestamp(msgs.message_time) AS "Sent", 
    msgs.message_subject AS "Subject", 
    msgs.message_text AS "Message" 

FROM msgs 

INNER JOIN users AS from_user 
ON msgs.author_id = from_user.user_id 

INNER JOIN users AS to_user 
ON msgs.to_address = CONCAT("u_", to_user.user_id); 

基本上,你加入users表到msgs表兩次,給表的每個實例不同的名稱和不同的連接條件。然後,您可以從users表的特定實例中選擇特定列。

+0

你錯過了'FROM消息' – 2012-07-19 19:29:51

+0

@PugganSe所以我做到了。修正了,謝謝。 – cdhowie 2012-07-19 19:33:02

+0

因此,如果我正在理解結構權限,「INNER JOIN用戶AS from_user」是基本上創建臨時表嗎?它工作完美,只是試圖看看我是否理解每個部分。 – 2012-07-19 19:37:49

0

我想你想要做這樣的事情

SELECT msgs.*, 
     authors.whatever, 
     addresses.to_address 
    FROM msgs 
    JOIN users AS authors ON msgs.author_id = authors.id 
    JOIN users AS addresses ON msgs.address_id = addresses.id 

我的查詢可能是不準確的,但你也許可以看到我在這裏做什麼。

另外,我會推薦not abbreviating msgsusing singular table names

+0

它是從腳本安裝的。我實際上沒有設計表格佈局。改變它需要在我的網站上編輯太多的內容。 – 2012-07-19 19:35:28

0

需要兩個連接,只要你想獲得兩個獨立的用戶:

select f.username, t.username 
from msgs m 
inner join users f on f.user_id = m.author_id 
inner join users t on concat("u_", t.user_id) = m.to_address 
0

這將返回同時與「AUTHOR_ID」和「to_address」相關的用戶名,使用相關子查詢,而不是使用JOIN 。 (使用JOIN是通常的做法,但使用相關子查詢的方法給你一些額外的靈活性

SELECT (SELECT u.username 
      FROM users u 
      ON u.user_id = CONCAT("u_",u.user_id) = m.to_address 
     ORDER BY u.username LIMIT 1 
     ) AS to_username 
    , (SELECT a.username 
      FROM users a 
      ON a.user_id = m.author_id 
      ORDER BY a.username LIMIT 1 
     ) AS author_username 
    , m.* 
    FROM msgs m 

注:此略有不同從INNER JOIN中,這將味精當返回一行未找到與to_address或author_id匹配的用戶名。)

注意:這裏假定user_id在users表中是唯一的。

注意:如果username列在用戶表NOT NULL,那麼你可以模擬INNER JOIN,而不是通過增加

HAVING to_username IS NOT NULL 
    AND author_username IS NOT NULL 
返回一行,如果匹配的用戶名未找到AUTHOR_ID或to_address