2011-03-30 80 views
1

在之前的問題中,我被告知如果我想爲一個用戶存儲多種語言,那麼最好有一個單獨的表映射語言和用戶在一起。 這是有道理的,因爲它是一個經典的多對多關係,所以這就是我所做的。使用MYSQL打印多個數據的正確方法是什麼?

我現在的問題是我可以寫什麼樣的查詢來連接每個用戶的所有語言名稱,然後將其顯示爲表?

我提出了以下(是正確的嗎?):

CREATE TABLE language (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
name char(20) NOT NULL UNIQUE) 

CREATE TABLE user (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
name char(20) NOT NULL UNIQUE) 

CREATE TABLE user_language (
id_user INT REFERENCES user(id), 
id_lang INT REFERENCES language(id)) 

我然後插入3個測試用戶,7種測試語言和插入9對到USER_LANGUAGE表。現在我想用一個MySQL查詢打印每個用戶在用戶名旁邊說的語言的連接列表,我不知道該怎麼做。 例如我想看看

User | Languages 
--------|--------------- 
Bob  | English, French 
Alex | Spanish, Portuguese 
Ivan | Russian, English, German 

任何想法?我是否在正確的軌道上?

編輯

我知道的JOIN功能,使打印出清單作爲一組單獨對的是不是我的本意。我特別想連接每個用戶的語言,而無需在腳本中編寫循環(在我的情況下,這將在PHP中)。 我認爲可能有一些方法來編寫子查詢並使用CONCATENATE函數來幫助我...?我離開嗎?

回答

1

你會想看看使用INNER JOIN來做到這一點。本質上,JOIN將查看每個字段中的ID,然後將數據匹配到具有匹配ID的條目。

考慮下面的SQL查詢:

SELECT user.*, language.name FROM user 
INNER JOIN user_language ON user.id = user_language.id_user 
INNER JOIN language ON user_language.id_lang = language.id; 

秩序內的JOIN的是很重要的;我們需要做的第一件事就是能夠引用與用戶ID相關的語言ID。第一個INNER JOIN將給每個用戶一個用戶可以說的語言ID列表。第二種是將分配給用戶的語言ID映射到名稱。

但是,上述內容不會以逗號分隔的列表返回。相反,你會得到這樣的事情:

name | language 
------------------------- 
bob  | English 
bob  | Dutch 
Sally | English 
Sally | Spanish 
Sally | German 

你必須做一些後期處理,以將數據放到一個逗號分隔的列表。幾乎所有的語言都應該相當簡單。

+0

如果事實證明確實是唯一的方法,我可能會接受這個答案。我確信會有一些聰明的方法讓MySQL爲我進行連接,而不必訴諸編寫腳本中的循環。 – twerdster 2011-03-30 01:35:44

+1

因此,在其他人發帖後,別人正確回答了我的問題之後。不過,你的回答讓我接近了,所以我標記爲正確。我正在查找的命令是GROUP_CAT。 http://www.mysqlperformanceblog.com/2006/09/04/group_concat-useful-group-by-extension/ – twerdster 2011-03-30 08:57:15

0
select a.name, b.name from language a, user b where id_user = b.id and id_lang = a.id; 
+0

我相信用戶映射到語言通過user_language表。 – Suroot 2011-03-30 01:24:54

0

是的,這是一個完全有效的設計。

SELECT user.name, language.name FROM user INNER JOIN user_language ON(user.id = user_language.id_user) INNER JOIN language ON(language.id_lang = language.id); 
0
SELECT u.name as user, l.name as language 
    FROM USER u 
    INNER JOIN user_language ul ON u.id = ul.id_user 
    INNER JOIN LANGUAGE l ON ul.id_lang = l.id; 
+1

使用你的代碼最終的查詢是:SELECT user,GROUP_CONCAT(language SEPARATOR',')FROM( SELECT l.name作爲用戶,l.name作爲語言 FROM USER u INNER JOIN user_language ul ON u.id = ul.id_user INNER JOIN LANGUAGE l ON ul.id_lang = l.id)AS加入 GROUP BY用戶 – twerdster 2011-03-30 09:58:32

+0

非常不錯。我之前沒有聽說過GROUP_CONCAT,感謝分享解決方案 – laurent 2011-03-30 13:25:01

相關問題