2015-07-28 108 views
2

我正在用Codeigniter和MYSQL构建一个CMS。并有一个这样的桌子。要打印输出这样Mysql一个父多个子结果不重复父行

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> 

代码的任何调整被欢迎

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'); 

而想要输出。 因为我在过去的几个小时里一直在尝试这个。 在此先感谢。

更新: 我实现了我的代码作为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) ; 
} 
} 

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

+0

我不没有得到它,你需要输出,但是你提供的查询是'INSERT'和'CREATE'查询,而不是'SELECT',你希望我们提供'SELECT'查询? – Epodax

+0

我正在搜索选择查询。我已经尝试了两个表的左连接,但是自从父表重复使用后,我无法在foreach循环中使用它。 –

+0

好吧,是的,这是一个加入如何工作... – thebjorn

回答

1

有多种方法可以做到这一点。不过,我会用下面的办法:

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

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

    或者在笨:

    $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) 
    

希望这有助于

+1

感谢CodeGodie。这做了工作。 –

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...