2010-10-08 67 views
2

我有三個表需要連接一個子查詢的結果SELECT語句

Table1: Users 
Columns: User_ID (int), FirstName, LastName.... 
Values 
1   Jane  Doe 
2   John  Doe 
3   Mike  Smith 

Table2: User_Groups 
Columns: User_ID (int), Group_ID(int) 
Values: 
Row1: 1   2 
Row2: 1   3 
Row3: 2   1 
Row4: 2   3 
Row5: 3   1 

Table3: Groups 
Columns: Group_ID (int), GroupName(varchar) 
Values 
Row1: 1   Admin 
Row2: 2   Power User 
Row3: 3   Developer 

我想創建一個查詢,可以通過以下方式返回結果: **結果

UserID GroupNames 
Row1: 1  Power User, Developer 
Row2: 2  Admin, Developer 
Row3: 3  Admin 

在SQL Server - 我能夠使用這樣的事情來實現它:

SELECT User_ID, 
    SUBSTRING( 
    replace( 
     replace( 
    (SELECT Groups.GroupName 
    FROM User_Groups, Groups 
    where groups.Group_ID = 
        User_Groups.Group_ID AND 
       User_Groups.User_ID =Users.User_ID 
      FOR XML PATH('')) 
      ,'<GROUPNAME>',', ') 
     ,'</GROUPNAME>',''),3,2000) as UserGroups 
FROM User_Groups LEFT JOIN Groups ON 
User_Groups.Group_ID=Groups.Group_ID 
ORDER BY User_ID ASC 

我希望在MySQL中獲得類似的最終結果(嘗試過GROUP_CONCAT等),但不成功。我怎樣才能在MySQL中獲得類似的** RESULT。請注意表格已經存在,我不能改變它們。 任何幫助,將不勝感激

回答

1

這工作:

SELECT 
    t1.User_ID AS UserID, 
    (
     SELECT 
      GROUP_CONCAT(t2.GroupName) 
     FROM 
      Groups t2 
     WHERE 
      t2.Group_ID IN(
        SELECT 
         t3.Group_ID 
        FROM 
         User_Groups t3 
        WHERE 
         t3.iUser_ID = t1.User_ID 
      ) 
    ) AS GroupNames 
FROM 
    Users t1 

而這個樣子更好的主意,因爲你不希望有用戶名,所以這是沒有必要讓Users表:

SELECT 
    User_ID, 
    GROUP_CONCAT(GroupName) AS GroupNames 
FROM 
    (
     SELECT 
      t2.User_ID AS User_ID, 
      t3.GroupName AS GroupName 
     FROM 
      User_Groups t2 
     LEFT JOIN 
      Groups t3 ON (t3.Group_ID = t2.Group_ID) 
    ) tmp 
GROUP BY 
    User_ID