2013-03-17 62 views
0

我有从查询返回的以下数据,每一个名字是一个项目:解析一行多列php

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 

当我显示出来,每一个“项目”有一个ID,并显示在资料核实使用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 
+0

作为第一行说,每个名称是一个项目 – 2013-03-17 15:22:51

回答

2

你可以在你的MySQL查询中使用GROUP_CONCAT()将所有的意见一并每个名称

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

然后explode()在你的PHP代码

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

} 

$row[comment]编辑
感谢@CBroe,我现在知道临时工牛逼GROUP_CONCAT()group_concat_max_len默认的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; 

你还需要知道的max_allowed_packet,因为这是你可以设置var_group_concat_max_len到了极限。

注:mysql_query()不允许多个查询,所以你需要做2 mysql_query(),并且可以使用SET SESSION ...以便在当前会话的所有查询有max_len。最好从mysql_函数(这是贬值),并更改为mysqli_PDO,因为它们提供多个查询选项。还检查了 - http://php.net/manual/en/mysqlinfo.api.choosing.php

+0

好的基于数据库的分组解决方案。 – 2013-03-17 15:37:24

+1

Kepp记住:_“结果被截断为'group_concat_max_len'系统变量给出的最大长度,默认值为1024。”_(来自MySQL文档。)所以如果注释的意思是就像这里的评论系统一样,只有少数评论可以打出1024个字符。即使对于较短的评论,如果有很多人可以轻易达到这个限制。 – CBroe 2013-03-17 15:45:01

+0

@CBroe该死!感谢您指出,这是一个很好的解决方案,直到您提到 – 2013-03-17 15:48:48

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>'; 
} 
0

如果你没有得到通过ID已经回到数据排序,添加到您的查询的末尾:

ORDER BY name 

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

+2

我认为你的意思是按名称排序,然后按ID排序。否则(7,FF,一些评论)会打破你的系统。 – 2013-03-17 15:38:09

+0

@PhilipWhitehouse我认为id与姓名有关。固定 – eliot 2013-03-17 19:07:53