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