解析多行php的一个col

时间:2013-03-17 15:18:11

标签: php mysql

我有例如从查询返回的以下数据,每个名称都是一个项目:

id      name      comment
1       FF        hey
1       FF        hey back!
2       LL         
3       PP        i think its great!
3       PP        me too
3       PP        I'm not sure
4       TT         
5       II      
6       KK        yesterday is the new tomorrow

当我显示它时,每个'item'都有一个id,并在DIV中显示使用LI。

正如您所看到的,虽然“项目”有时会有多个评论,但每个评论都在一个单独的行

我想要做的是显示每个项目,然后在每个项目下显示评论(如果有的话)。因此,我无法在查询阶段对任何内容进行分组,因为评论部分是唯一的,但需要在显示阶段进行分组

所以目前有:

while ($row = mysql_fetch_array($result)){

echo '<li><div class=className><div class=itemName>'.$row[name].'</div>';

    if($row[comment]){ 

       echo '<div class=newRow>'.$row[comment].'</div>'; 

    }

echo '</div></li>';

}

现在,这并不好,因为这会为同一个项目生成多个显示,每个显示下都有一个注释。

我可以这样做,还是应该以不同方式引入数据?

理想的结果是例如

FF             LL             PP                       etc etc etc
hey                           i think its great!
hey back!                     me too
                              I'm not sure

3 个答案:

答案 0 :(得分:2)

您可以在mysql查询中使用GROUP_CONCAT()将每个名称的所有注释分组在一起

SELECT id, name
GROUP_CONCAT(comment) AS comment
FROM table
GROUP BY name;

然后explode()你的php代码中的$row[comment]

while ($row = mysql_fetch_array($result)){

echo '<li><div class=className><div class=itemName>'.$row['name'].'</div>';

    if($row['comment'] != ""){

       $comments = explode(",",$row['comment']);
       foreach($comments as $comment){
               echo '<div class=newRow>'.$comment.'</div>';
       } 

    }

echo '</div></li>';

}

修改
感谢@CBroe,我现在知道GROUP_CONCAT()的{​​{3}}默认值为1024.在运行GROUP_CONCAT()查询之前,您需要增加此值 -

SET [GLOBAL | SESSION] group_concat_max_len = 10240; // must be in multiples of 1024
SELECT id, name
GROUP_CONCAT(comment) AS comment
FROM table
GROUP BY name;

您还需要了解group_concat_max_len,因为这是您可以var_group_concat_max_len设置的限制。

注意:mysql_query()不允许多次查询,因此您需要执行2 mysql_query(),并且可以使用SET SESSION ...以便当前会话中的所有查询都具有max_len mysql_ 1}}。最好从{{1}}功能(已折旧)更改并更改为max_allowed_packetmysqli_,因为它们提供多个查询选项。还可以看看 - PDO

答案 1 :(得分:0)

不要将数据访问与输出混淆,您可以更轻松地攻击此类问题。

//Fetch and Sort
$data = array();
while ($row = mysql_fetch_array($result)){
   $item = $row['item'];
   if(!isset($data[$item]) {
     $data[$item] = array():
   }
   $data[ = $data[$item][] = $row['comment'];   
}

//Output
foreach($data as $item => $comments) {
    echo '<li><div class=className><div class=itemName>'.$item.'</div>';
    foreach($comments as $comment) {
      echo '<div class=newRow>'.$comment.'</div>'; 
    }
    echo '</div></li>';
}

答案 2 :(得分:0)

如果您没有按ID排序数据,请添加到查询的末尾:

ORDER BY name

将检索由id排序的相同列表。然后在while循环中,添加一个跟踪您看到的最后一个项目名称的变量。如果更改,请添加新的li,否则,将注释添加到当前列表的末尾。