MySQLは多対1列に参加する - mysql、select、group-by、left-join

私の問題を単純化するには:私は3つのテーブルがあるとしましょう。

Rooms              People                    Things
--------           --------                  --------
id| name           id | name | fk_rooms      id | name | fk_rooms
-----------        ---------------------     ---------------------
1 | kitchen        1  | John | 1              1 | TV   | 2
2 | bedroom        2  | Mary | 2              2 | bed  | 2
3  | Andy | 1              3 | sink | 1
4  | Laura| 1

今私は次のようなことをしています:

SELECT r.name AS room_name, p.name AS name, t.name AS thing FROM Rooms r
LEFT JOIN People p ON p.fk_rooms = r.id
LEFT JOIN Things t ON t.fk_rooms = r.id

私の場合はいくつかを除いて完全に動作します「Rooms」テーブルとの関係が多対1である。したがって、 "Rooms"テーブルに関連して "People"と "Things"の異なる名前を保持する結果セットの新しい行の代わりに、2つの行のみを受け取りたいとします。

1. kitchen, John, Andy, Laura, sink
2. bedroom, Mary, TV, bed

A GROUP BY r.id上でのみ select 各表から1行どんな助けも高く評価されます!

回答:

回答№1の場合は3

ここがあなたが探しているものです:

SELECT r.name AS room_name,
GROUP_CONCAT(p.name separator ",") AS people_name,
GROUP_CONCAT(t.name separator ",") AS things
FROM Rooms r
LEFT JOIN People p ON p.fk_rooms = r.id
LEFT JOIN Things t ON t.fk_rooms = r.id
GROUP BY r.id

回答№2の場合は1

はい、あなたはgroup by節が必要です。 GROUP_CONCAT 関数。 People.fk_roomsとThing.fk_roomsで結果をグループ化する必要があります。

たぶんあなたは2つの異なるクエリを使うことができます:3つの列を選択すると、RoomsIDとRoomNameとPeopleであり、2つ目はfk_roomsでグループ化されたRoomsとThingの結合になります.3つの列を選択すると、彼らはRoomID、RoomName、物事になっています。クエリでは、これらの選択肢にt1とt2という名前を付け、RoomsIDでt1とt2に参加し、t1.RoomName、t1.People、t2.Thingsを選択します。

がんばろう。


メニュー
最も人気のある