0

私はそのような2つのテーブルを持っています:

-----------------------------------------------------
| PLACES                                            |
-----------------------------------------------------
| Id             | Name          | Address          |
-----------------------------------------------------
| 1              | Parc          | 20 King St       |
| 2              | Bar           | 33 Main St       |
-----------------------------------------------------

-----------------------------------------------------
| PEOPLE                                            |
-----------------------------------------------------
| Id             | Place_id (fk) | Name             |
-----------------------------------------------------
| 1              | 2             | Luke             |
| 2              | 1             | Han              |
| 3              | 1             | Chewie           |
-----------------------------------------------------


すべての場所を関連する人々と一緒に表示したいと思います。そうするためには、(各人のエントリに同じ場所を設定するのではなく)人のリストを含む場所ごとに1つのレコードを作成するのがよいと思います。

私はSQLクエリにあまり詳しくないので、RightJoinとGroupByを使用してみましたが、良い結果は得られませんでした。

SELECT plc.name, plc.address, plp.name 
        FROM places plc
            RIGHT JOIN people plp
                ON plp.place_id = plc.id
                    GROUP BY plc.name;


「$query->fetchAll();」を実行した後に得られた結果 PHPでは次のようなものでした:

Object {name: "Bar", address: "33 Main St", name: "Luke"}
Object {name: "Parc", address: "20 King St", name: "Han"}
Object {name: "Parc", address: "20 King St", name: "Chewie"}


可能な最善の解決策は、そのようにフィルタリングされたものを用意することです。これにより、バックエンド側とフロントエンド側の両方からの追加作業が防止されます。しかし、それが可能かどうかはまったくわかりません

Object {name: "Bar", address: "33 Main St", name: "Luke"}
Object {name: "Parc", address: "20 King St", name: ["Han", "Chewie"]}


これをどのように達成できるかについてのアドバイスや提案はありますか?ありがとう!

4

4 に答える 4

2

最も簡単な方法は、group_concatを使用することです

select
  place.id as `Id`,
  place.address as `address`,
  GROUP_CONCAT(people.name) as `peopleList`
from
  place,
  peoples
where
  place.id=people.place_id
group by
  place.id

また、結果がトリミングされている場合は、次のようにGROUP_CONCATのサイズ制限を増やすことができます。

SET SESSION group_concat_max_len = 8192;
于 2012-11-16T19:57:56.553 に答える
1

この目的のために、GROUP_CONCAT()関数が使用されます。

DBでテストするためのクエリを次に示します。

SELECT p.*, GROUP_CONCAT(pp.name) as people_list FROM places p inner join people pp on p.id = pp.place_id group by p.id;
于 2012-11-16T19:51:17.460 に答える
0

これを試して:

SELECT a.Name, a.Address, group_concat( b.Name ) AS pname FROM `places` AS a
LEFT JOIN `people` AS b ON a.Id = b.Place_id
GROUP BY a.Name

お役に立てれば。

于 2012-11-16T19:44:58.120 に答える
0

フランク、私はあなたの目標を達成するための解決策を知っています。次のような結果を返すクエリがあります。

Object {name: "Bar", address: "33 Main St", name: "Luke"}
Object {name: "Parc", address: "20 King St", name: "Han"}
Object {name: "Parc", address: "20 King St", name: "Chewie"}

これは本当に素晴らしいことです。データが解析しやすいことを確認するために、クエリで名前順に並べます。

SELECT plc.name, plc.address, plp.name 
        FROM places plc
            RIGHT JOIN people plp
                ON plp.place_id = plc.id
            order by plc.id

groupby句を除外していることに注意してください。

これで、オブジェクトのセットを反復処理し、説明した構造を持つ別のオブジェクトのセットを作成して、準備が整いました。

于 2012-11-16T20:00:08.843 に答える