2012-11-09 43 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特定的语法,对不起。