2

データベース: MySQL

表: チーム

TeamID    INT
TeamName  VARCHAR(20)

表: 人

PeopleID   INT
FirstNameID INT
LastNameID  INT

表: チームメンバー

TeamID  INT
PeopleID  INT

テーブルの例: チーム

TeamID       TeamName
1            Team Xstream
2            Team INsanity

表の例: 人

PeopleID   FirstNameID   LastNameID
1          1351          453
2          5463          763
3          976           8762
4          87            784
5          187           465
6          761           566
7          376           2134

テーブルの例: TeamMembers

TeamID       PeopleID
1            1
1            3
1            7
2            2
2            4
2            5
2            6

望ましい出力:

TeamName       TeamMembers
Team Xstream   John Smith/Jane Doe/Daniel Davis
Team INsanity  Sally Sue/Tom Thomas/Jack Jones/Harry Henderson

チームごとに設定された数の TeamMembers はないため、チーム メンバーが 3 人しかいないため、3 つのサブクエリを持つことはできません。私は軽くオンラインで調べましたが、ここでは常に最良かつ最も完全な回答が得られます. アイデアや指針があれば、お知らせください。正直なところ、ここからどこから始めればよいかわかりません。ありがとう。

4

2 に答える 2

4

ID番号を名前として表示しているだけであることを考えると、人々の名前は実際にはどこかに保存されていると思います。ただし、この結果にはCONCAT()との両方を使用する必要があります。GROUP_CONCAT()最初のステップでは、すべてのテーブルを結合し、次のCONCAT()関数を使用します。

select t.teamname,
 concat(p.FirstNameId, ' ', p.LastNameId) teamMembers
from teams t
left join teammembers m
  on t.teamid = m.teamid
left join people p
  on m.peopleid = p.peopleid;

結果を生成するSQL Fiddle with Demoを参照してください。

|      TEAMNAME | TEAMMEMBERS |
-------------------------------
|  Team Xstream |    1351 453 |
|  Team Xstream |    976 8762 |
|  Team Xstream |    376 2134 |
| Team INsanity |    5463 763 |
| Team INsanity |      87 784 |
| Team INsanity |     187 465 |
| Team INsanity |     761 566 |

データを取得したら、GROUP_CONCAT()関数とGROUP BYチーム名を適用します。

select t.teamname,
  group_concat(concat(p.FirstNameId, ' ', p.LastNameId) SEPARATOR '/') teamMembers
from teams t
left join teammembers m
  on t.teamid = m.teamid
left join people p
  on m.peopleid = p.peopleid
group by t.teamname;

デモで SQL Fiddle を参照してください

結果:

|      TEAMNAME |                     TEAMMEMBERS |
---------------------------------------------------
| Team INsanity | 761 566/87 784/187 465/5463 763 |
|  Team Xstream |      976 8762/376 2134/1351 453 |
于 2012-11-06T22:02:03.073 に答える
1

名前が実際に格納されているテーブルに関する情報は提供しませんでしたが、探しているのはGROUP_CONCAT関数です。これは、姓と名の ID を表示するために使用する方法です。名前テーブルを結合し、クエリの名前 ID フィールドを実際の名前フィールドに置き換える作業は、あなたに任せます。

SELECT t.TeamName, GROUP_CONCAT(CONCAT(p.FirstNameID, ' ', p.LastNameID))
FROM Teams as t
INNER JOIN TeamMembers as tm on t.TeamID = tm.TeamID
INNER JOIN People as p on tm.PeopleID = p.PeopleID
GROUP BY t.TeamName

ところで、名前を独自のテーブルに正規化して nameID を使用することは、過剰正規化の良い例のように思えます。People テーブルに名前の値を持たないのはなぜですか? これにより、クエリに 4 番目のテーブルを追加する必要がなくなります (名前と姓が異なるテーブルにある場合は、5 番目のテーブルも追加される可能性があります)。

于 2012-11-06T22:09:34.040 に答える