Php 一个父行,另一个表中的多个子行。如何把它们排成一行?

Php 一个父行,另一个表中的多个子行。如何把它们排成一行?,php,sql,mysql,Php,Sql,Mysql,我是当地一家非营利组织的志愿者,该组织在节日期间发放玩具和食品。我帮助他们的一个方法是把他们的礼物/食物请求放到网上。通过这种方式,他们不用在15小时内手动将1000个左右的名字输入Excel,只需点击一个链接,就可以在几秒钟内将整个内容导出 我的问题是如何在一次查询中从数据库中获取数据。我相信这是可能的,但我不能完全相信我能做到 有一个家长表,其中包含将收到礼物的孩子的家庭信息(每个家庭1行)。有一个子表,其中包含族的子项信息(每个子项1行,每个父项行多行)。每个父行将有1-3个子行 PARE

我是当地一家非营利组织的志愿者,该组织在节日期间发放玩具和食品。我帮助他们的一个方法是把他们的礼物/食物请求放到网上。通过这种方式,他们不用在15小时内手动将1000个左右的名字输入Excel,只需点击一个链接,就可以在几秒钟内将整个内容导出

我的问题是如何在一次查询中从数据库中获取数据。我相信这是可能的,但我不能完全相信我能做到


有一个家长表,其中包含将收到礼物的孩子的家庭信息(每个家庭1行)。有一个子表,其中包含族的子项信息(每个子项1行,每个父项行多行)。每个父行将有1-3个子行

PARENT TABLE
-----------------------------
id
name
address
city

CHILDREN TABLE
-----------------------------
parent_id
name
gift1
gift2
gift3

我想在从数据库导出数据时,将所有孩子的信息与家长的信息放在一行中,以便将其放入CSV文件中。我知道我可以通过两个单独的查询来完成这项工作,但如果可能的话,我不想为每个家庭的孩子访问数据库


我已经思考了一个小时左右,想不出我该如何完成这个任务。我确信我需要加入表,但我不确定如何区分每个子项并避免重复它们,而不是获得下一个子项(如果有)。

由于每个父项的子项数量可变,因此在
SQL
中唯一可以做的方法是在单个记录中以分号分隔显示所有礼物:

SELECT  p.*, GROUP_CONCAT(c.name, ': ', c.gift1, ', ', c.gift2, ', ', c.gift3 SEPARATOR ';')
FROM    parents p
JOIN    children с
ON      c.parent_id = p.id
GROUP BY
        p.id
这将为您提供如下信息:

parent      children_and_gifst
Mr. Jones   Alice: teddy bear, candy, drum; Bob: pup, sword, flute

,将所有孩子及其礼物放在一列中。

由于每个家长的孩子数量可变,因此在
SQL
中,唯一的方法是将所有礼物分号显示在单个记录中:

SELECT  p.*, GROUP_CONCAT(c.name, ': ', c.gift1, ', ', c.gift2, ', ', c.gift3 SEPARATOR ';')
FROM    parents p
JOIN    children с
ON      c.parent_id = p.id
GROUP BY
        p.id
这将为您提供如下信息:

parent      children_and_gifst
Mr. Jones   Alice: teddy bear, candy, drum; Bob: pup, sword, flute

,所有的孩子和他们的礼物都在一列中。

您能举例说明您希望结果行的外观吗?这是一个相对简单的pivot表,但由于1:many关系而变得复杂(因此pivot表的列名称变得至关重要,因此您需要知道子项的最大数量)。为什么不使用第二个查询呢?它将更加灵活……“我希望将所有孩子的信息与家长的信息放在一行中”-是每个孩子一行(即单亲多行),还是每个家长一行(即同一行上的同一家长多个孩子)?“每个家长行将有1-3个孩子行。”那么有三个以上孩子的家庭会错过吗?@马克·班尼斯特,事实上,有三个以上孩子的家庭是可以入住的。他们尽最大努力帮助尽可能多的家庭和孩子。我想你没有抓住我问题的重点——你的先决条件“每个家长行将有1-3个孩子行”似乎不允许每个家庭有超过3个孩子。你能举个例子说明你希望结果行的外观吗?这是一个相对简单的pivot表,但由于1:many关系而变得复杂(因此pivot表的列名称变得至关重要,因此您需要知道子项的最大数量)。为什么不使用第二个查询呢?它将更加灵活……“我希望将所有孩子的信息与家长的信息放在一行中”-是每个孩子一行(即单亲多行),还是每个家长一行(即同一行上的同一家长多个孩子)?“每个家长行将有1-3个孩子行。”那么有三个以上孩子的家庭会错过吗?@马克·班尼斯特,事实上,有三个以上孩子的家庭是可以入住的。他们尽最大努力帮助尽可能多的家庭和孩子。我想你错过了我问题的重点——你的先决条件“每个家长行将有1-3个孩子行”似乎不允许每个家庭有超过3个孩子。+1,很高兴知道我没有疯狂地找到我认为存在的解决方案。这就足够了,因为我可以使用一点PHP来完成其余的需求。谢谢。小心不要有太多的儿童记录
GROUP\u CONCAT()
是长度限制的(服务器变量
GROUP\u CONCAT\u max\u len
),将截断超过此限制的任何内容。默认值为1024字节。+1,很高兴知道我没有疯狂地寻找我认为存在的解决方案。这就足够了,因为我可以使用一点PHP来完成其余的需求。谢谢。小心不要有太多的儿童记录
GROUP\u CONCAT()
是长度限制的(服务器变量
GROUP\u CONCAT\u max\u len
),将截断超过此限制的任何内容。默认值为1024字节。