5

MySQL データベースに次の 2 つのテーブルがあるとします。

Table 1:: EMP: EmpID, EmpName
eg. (1, 'John'), (2,'Alex'),(3,'Tom')

Table 2:: Team: TeamID, ManagerID, MemberID
eg. record1: (Team1, 1, 2), record2: (Team1, 1, 3) 

id team1 のチームがあり、John がマネージャーで、Alex と Tom がそのメンバーです。

以下のようにTeamテーブルのレコードを画面に表示したい

| Team  | Manager | Members   |
| team1 | John    | Alex, Tom |

上記の2つのテーブルを結合し、メンバーIDに基づいてメンバーの名前を返すSQLクエリは何ですか。

また、結果はカンマで区切られたすべてのチーム メンバーを含む 1 行として表示されます。

これら 2 つのテーブルを設計するためのより良い方法があれば、それも提案してください。それは非常に高く評価されます。

ありがとう。

4

4 に答える 4

8

を使用する必要があると思いますGROUP_CONCATGROUP_CONCAT()関数は、列の値を単一の文字列に連結するために使用されます。それ以外の場合は、多くの行のルックアップを実行し、クライアント エンドでそれらを連結する場合に非常に便利です。

SELECT  b.TeamID as TeamName, 
        a.EmpName as Manager,
        GROUP_CONCAT(c.EmpName) Members
FROM    Emp a
            INNER JOIN Team b
                ON a.EmpID = b.ManagerID
            INNER JOIN  Emp c
                ON b.MemberID = c.EmpID
GROUP BY b.TeamID, a.EmpName

セパレーターと順序を変更することもできます

GROUP_CONCAT( c.EmpName SEPARATOR '-' ),...
GROUP_CONCAT( c.EmpName ORDER BY c.EmpName DESC ),...

SQLFiddle デモ

于 2012-09-05T05:59:53.157 に答える
0

GROUP_CONCAT(expr)を使用すると、次のようなものを試すことができます

この関数は、グループの非 NULL 値を連結した文字列結果を返します。NULL 以外の値がない場合は、NULL を返します。グループ内の値の間のデフォルトの区切り文字はコンマ (",") です。

SELECT  t.TeamID Team,
        m.EmpName manager,
        GROUP_CONCAT(mem.EmpName) Members
FROM    Team t INNER JOIN
        Emp m   ON  t.ManagerID = m.EmpID INNER JOIN
        Emp mem ON  t.MemberID = mem.EmpID
GROUP BY    t.TeamID Team,
            m.EmpName
于 2012-09-05T05:59:04.920 に答える
0

EMPテーブルに 2 回参加しgroup_concat、メンバーを個別にリストするために使用する必要があります。

select TeamID as Team, 
       e2.EmpName as Manager,
       group_concat(e1.EmpName) as Members
from Team t
left outer join EMP e1 on t.MemberID = e1.EmpID
left outer join EMP e2 on t.ManagerID = e2.EmpID
group by TeamID

を使用するleft outer joinと、チームにマネージャーやメンバーがいない場合でも結果が得られます。メンバーとマネージャーがいるチームのみが必要な場合は、 を使用できますinner join

于 2012-09-05T06:00:01.800 に答える
-1

次の定義で vTeam というビューを定義します。

SELECT dbo.Team.TeamID, dbo.EMP.EmpName AS Manager, EMP_1.EmpName AS Member, EMP_1.EmpID AS MemberID, dbo.EMP.EmpID AS ManagerID FROM
dbo.EMP AS EMP_1 RIGHT OUTER JOIN dbo.Team ON EMP_1.EmpID = dbo.Team.MemberID 左外部結合 dbo.EMP ON dbo.Team.ManagerID = dbo.EMP.EmpID

このクエリにより、結果が得られます。

SELECT TeamID, Manager, MemberList = STUFF(( SELECT ',' + Member FROM vTeam as xx WHERE xx.TeamID = x.TeamID and x.Manager = xx.Manager FOR XML PATH(''), TYPE).value(' .[1]', 'nvarchar(max)'), 1, 1, '') FROM dbo.vTeam AS x GROUP BY TeamID,Manager;

チーム1 ジョン・アレックス、トム
チーム2 アレックス ジョン、アレックス、トム

于 2012-09-05T06:23:05.147 に答える