Mysql one Parent多个子结果,不重复父行

时间:2015-07-28 11:54:41

标签: php mysql codeigniter

我正在使用Codeigniter和MYSQL构建CMS。并有一个这样的表。

CREATE TABLE parent
(`parentId` int, `parentName` varchar(50));

INSERT INTO parent
(`parentId`, `parentName`)
VALUES
(1, 'Movie'),
(2, 'Food'),
(3, 'Sports');

CREATE TABLE child
(`childId` int, `parentId` int,`childName` varchar(50));
INSERT INTO child
(`childId`, `parentId`, `childName`)
VALUES
(1, 1, 'Harry Potter'),
(2, 3, 'Foot Ball'),
(3, 2, 'Pizza'),
(4, 2, 'Burger'),
(5, 1, 'Avengers'),
(6, 1, 'Fury'),
(7, 3, 'Cycling');

并希望输出像这样打印输出

foreach($parent as $parentData):
echo"<h4>".$parentData->parentName."</h4>";
echo"<ul>";
 foreach($child as childData):
 echo"<li>".$childData->childName."</li>";
 endforeach;
echo"</ul>"
endforeach;

产生这个

<h4>Movie</h4>
<ul>
<li>Harry Potter</li>
<li>Avengers</li>
<li>Fury</li>
</ul>
<h4>Food</h4>
<ul>
<li>Pizza</li>
<li>Burger</li>
</ul>
<h4>Sports</h4>
<ul>
<li>Foot Ball</li>
<li>Cycling</li>
</ul>

欢迎任何调整代码。 正如我过去几个小时一直在尝试这样。 提前谢谢。

更新: 我按照CodeGodie的建议实现了我的代码的答案,并添加了这样的视图。

foreach ($result as $arr) {
if (!isset($final[$arr["parentName"]])) {
    $final[$arr["parentName"]] = array();
}
array_push($final[$arr["parentName"]], $arr);
}
foreach ($final as $parent=> $childs) {
echo $parent."<br>";
foreach ($childs as $child) {
    print_r($child) ;
}
}

现在我得到了我期待的结果

3 个答案:

答案 0 :(得分:2)

有多种方法可以做到这一点。但是我会使用以下方法:

  1. 您需要创建以下SQL查询:

    SELECT * FROM parent p
    JOIN child c ON c.parentId = p.parentId
    ORDER BY parentName
    

    或者在Codeigniter中:

    $this->db->select("*");
    $this->db->from("parent p");
    $this->db->join("child c", "c.parentId = p.parentId ");
    $this->db->order_by("parentName");
    $q = $this->db->get();
    return $q->result_array();
    

    会给你一个像这样的结果:

    $result = array(
        array(
           "parentId" => 2,
           "parentName" => "Food",
           "childId" => 3,
           "childName" => "Pizza",
        ),
        array(
           "parentId" => 2,
           "parentName" => "Food",
           "childId" => 4,
           "childName" => "Burger",
        ),
        array(
           "parentId" => 1,
           "parentName" => "Movie",
           "childId" => 1,
           "childName" => "Harry Potter",
        ),
        array(
           "parentId" => 1,
           "parentName" => "Movie",
           "childId" => 5,
           "childName" => "Avengers",
        )
    );
    
  2. 迭代搜索结果:

    foreach ($result as $arr) {
        if (!isset($final[$arr["parentName"]])) {
            $final[$arr["parentName"]] = array();
        }
        array_push($final[$arr["parentName"]], $arr);
    }
    
    var_dump($final);
    

    这将为您提供这样的结果,然后您可以迭代来构建HTML:

    array (size=2)
      'Food' => 
        array (size=2)
          0 => 
            array (size=4)
              'parentId' => int 2
              'parentName' => string 'Food' (length=4)
              'childId' => int 3
              'childName' => string 'Pizza' (length=5)
          1 => 
            array (size=4)
              'parentId' => int 2
              'parentName' => string 'Food' (length=4)
              'childId' => int 4
              'childName' => string 'Burger' (length=6)
      'Movie' => 
        array (size=2)
          0 => 
            array (size=4)
              'parentId' => int 1
              'parentName' => string 'Movie' (length=5)
              'childId' => int 1
              'childName' => string 'Harry Potter' (length=12)
          1 => 
            array (size=4)
              'parentId' => int 1
              'parentName' => string 'Movie' (length=5)
              'childId' => int 5
              'childName' => string 'Avengers' (length=8)
    
  3. 希望这有帮助

答案 1 :(得分:0)

我认为你正在寻找小组联合

https://www.percona.com/blog/2013/10/22/the-power-of-mysqls-group_concat/

使用此选项,您可以选择以逗号分隔的子值列表。然后在你的PHP中你只需要在逗号上爆炸然后循环它。

请记住默认的group_concat限制通常很低,所以你可能需要增加它 - https://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_group_concat_max_len

答案 2 :(得分:0)

此查询将获取所有数据:

SELECT parent.parentName, child.childName 
FROM parent 
INNER JOIN child on parent.parentId = child.parentId;

并将其作为:

返回
------------------------------
parentname    |    childName
------------------------------
Movie         |    Harry Potter
Movie         |    Avengers
Movie         |    Fury
et cetera...