0

我有两张这样的桌子:

-----------------------------------------------------
| 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           |
-----------------------------------------------------


我想展示每个地方及其相关人员。要做到这一点,我认为每个地方都有一个带有人员列表的记录会很棒(而不是每个人条目都有相同的地方)。

我真的不熟悉 SQL 查询,所以我尝试使用 Right Join 和 Group By 没有任何积极的结果。

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() 函数用于此目的。

这是一个查询,供您在数据库上进行测试。

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

弗兰克,我知道实现您目标的解决方案。你有你的查询,它返回如下结果:

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

请注意,我已经排除了 group by 子句。

好的,现在您可以遍历您的对象集,构建另一组具有您所描述的结构的对象,瞧,您准备好了。

于 2012-11-16T20:00:08.843 回答
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 回答