2012-11-09 48 views
3

我有3個表:SELECT類別從映射表

categories: 
ID, category 
"1","Cars" 
"2","Trucks" 
"3","Bikes" 
"4","Planes" 
"5","Boats" 

users: 
ID, username 
"1","john" 
"2","bob" 
"3","billy" 

users_categories: 
ID, userid, categoryid 
"1","1","2" 
"2","1","5" 
"3","2","3" 
"4","3","2" 
"5","3","4" 
"6","3","5" 

Q1。我要的是:

john,Trucks,Boats 
bob,Bikes 
billy,Trucks,Planes,Boats 

我來此。一個Concat的類別會做。

SELECT U.`username`, (SELECT C.`category` FROM `categories` C LEFT JOIN `users_categories` UC ON C.`ID` = UC.`categoryid` WHERE U.ID = UC.userid) FROM `users` U 

,但我得到#1242 - 子查詢返回多個1行。

Q2。有沒有更好的方法來構造這個?不會超過50-100個類別。

回答

4

使用GROUP_CONCAT達到你想要

SELECT a.username, 
     GROUP_CONCAT(c.category) 
FROM users a 
     INNER JOIN users_categories b 
      On a.Id = b.userID 
     INNER JOIN categories c 
      ON b.categoryID = c.ID 
GROUP BY a.ID 
+0

哇!這很快,它的工作原理!謝謝。 – EPQRS

+0

不客氣:D –

+0

我想知道爲什麼SqlFiddle的執行計劃陳述'使用臨時;使用filesort'當它可以按排序順序生成結果? –

0

,如果你可以與具有類別爲逗號分隔字符串生活,你可以使用GROUP_CONCAT功能是什麼。

讓我們看看(我從來沒有嘗試過自己在MySQL)

select u.username, 
     GROUP_CONCAT(DISTINCT c.Category order by c.Category SEPARATOR ',') 
from users u 
    join usersCategories uc 
     on u.ID = uc.userID 
    join Categories c 
     on c.ID = uc.CategoryID 

您可能需要將其調整到MySQL特定的語法,對不起。