所以我的措辞非常糟糕所以请耐心等待。
我正在建立一个人们可以为孩子购买礼物的网站,每个孩子可以在他们的列表中有多个礼物。
我有两张表children
和gift_list
。这些表非常基本,包含以下行:
children
- id
- name
- age
- status
gift_list
- id
- child_id
- description
- status
我正试图抓住属于一个孩子的所有礼物并将它们作为子对象的数组返回,但是我得到了奇怪的结果。
这是我当前的SQL语句:
SELECT * FROM children JOIN gift_list WHERE gift_list.child_id = children.id
结果是:
Child A:
- id
- name
- age
- status
- gift A
Child A:
- id
- name
- age
- status
- gift B
我知道我需要循环遍历gift_list
表,然后将它们添加到数组中,但我是MySQL的新手,我迷失了这个概念,无法想到如何正确搜索为了我想要完成的事情。最终结果将是:
Child A:
- id
- name
- age
- status
- gifts
- gift A
- description
- status
- gift B
- description
- status
任何帮助将不胜感激!作为旁注,可能很重要,我正在使用PHP框架CodeIgniter。
修改
使用下面的建议几次尝试失败后,我终于得到了以下代码才能工作......可能有更好/更清洁的方法来做到这一点......如果是这样,请告诉我:)
$children = $this->db->get('children');
$gift_list = $this->db->get('gift_list');
foreach ( $children->result() as $child )
{
$gifts = array();
foreach ( $gift_list->result() as $gift )
{
if ( $child->id == $gift->children_id )
{
array_push($gifts, $gift);
$child->gifts = $gifts;
}
}
}
echo "<pre>";
print_r($children->result());
echo "</pre>";
感谢所有的建议!
答案 0 :(得分:3)
您需要执行2个不同的查询。第一个得到孩子,另一个得到他们的礼物。
第一个查询的示例:
SELECT * FROM children WHERE ... any children-related criteria here ...
你现在应该有阵列(还没有礼物):
Child A:
- id (let's say this equals 1)
- name
- age
- status
Child A:
- id (let's say this equals 2)
- name
- age
- status
重要的是,该数组的键是子ID(好吧,至少它会使事情变得更容易)。
使用该数组,构建以下查询:
SELECT * FROM gift_list WHERE child_id IN (1, 2);
您可以使用以下内容执行此操作:
$gifts_sql = 'SELECT * FROM gift_list WHERE child_id IN (' . implode(', ', array_keys($children)) . ')';
您现在应该遍历该查询的结果并将其附加到:
while ($row = mysql_fetch_assoc($result)) {
$children[$row['child_id']]['gifts][$row['gift_id']] = $row;
}
您的$children
数组现在看起来应该如此。
答案 1 :(得分:0)
你说你得到了奇怪的结果,但不是那些结果。如果你以某种方式迭代查询结果,也许你需要订购结果?添加类似
的内容ORDER BY children.id, gift.id
到最后,也许。