Php 如何将链接/关联表连接的数据合并到查询的一列中?

Php 如何将链接/关联表连接的数据合并到查询的一列中?,php,mysql,sql,subquery,Php,Mysql,Sql,Subquery,我有以下模式: TABLE 1: People ------------------ id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name .... TABLE 2: PeopleAddresses ------------------------ peopleId INT NOT NULL, addressId INT NOT NULL, PRIMARY KEY(peopleId,addressId) TABLE 3: Addresses ---

我有以下模式:

TABLE 1: People
------------------
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name ....

TABLE 2: PeopleAddresses
------------------------
peopleId INT NOT NULL,
addressId INT NOT NULL,
PRIMARY KEY(peopleId,addressId)

TABLE 3: Addresses
------------------
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
street1 ....
有了这个,每个人都可以有许多地址。我想做一个查询,返回数据,每个人都得到一行,他们的地址都放在一个名为“地址”的列中,并用换行符分隔。例如:

NAME         ADDRESSES
---------    --------------------------------------
John         33 Some Rd, San Diego, CA 02111
             75 Another Rd, Santa Monica, CA 02112
---------------------------------------------------
Sam          44 Some Rd, San Diego, CA 02111
---------------------------------------------------
Jack         55 Some Rd, San Diego, CA 02111
             75 Some Rd, San Diego, CA 02111
---------------------------------------------------
我该怎么做?只从PHP中执行单独的查询,然后将PHP中的所有内容组合起来是更好的做法,还是最好只执行一个查询,其中(可能)包含一组子查询,但只执行一次DB trip


重要信息:我没有在此数据库上创建存储过程的权限。

这可能效率不高,但我可以:

SELECT 
    NAME, 
    (SELECT GROUP_CONCAT(
        street1, 
        '\n', 
        city, 
        ',', 
        state, 
        ',', 
        zip 
        SEPARATOR '\n\n'
    ) AS Addresses 
    FROM Addresses 
    LEFT JOIN PeopleAddresses ON Addresses.id = PeopleAddresses.addressId 
    WHERE PeopleAddresses.peopleId = 23) AS Addresses 
FROM People WHERE People.id = 23;

这将返回一行,其中人员的姓名和地址用两行分隔。

如果您希望在单个查询中使用

您可以根据需要选择分隔符

“仅内部联接”将返回匹配的数据,因此您可以使用“左联接”列出没有任何地址的用户

select 
p.id,
p.name,
address
from People p
left join 
(
  select 
  pa.peopleId,
  group_concat(a.street1 separator ' || ') as address
  from PeopleAddresses pa
  inner join Addresses a on a.id = pa.addressId
  group by pa.peopleId
)t
on t.peopleId = p.id
group by p.id

但请记住,结果会被截断到最大值 组_concat_max_len系统变量给定的长度, 其默认值为1024。该值可以设置得更高, 虽然返回值的有效最大长度为 受max_allowed_数据包的值约束

select 
p.id,
p.name,
address
from People p
left join 
(
  select 
  pa.peopleId,
  group_concat(a.street1 separator ' || ') as address
  from PeopleAddresses pa
  inner join Addresses a on a.id = pa.addressId
  group by pa.peopleId
)t
on t.peopleId = p.id
group by p.id