0

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

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,并显示在 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
4

3 回答 3

2

您可以GROUP_CONCAT()在 mysql 查询中使用,将每个名称的所有评论组合在一起

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

然后explode()$row[comment]你的 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>';

}

编辑感谢@CBroe,我现在
知道默认值为 1024。您将需要在运行查询之前增加它-GROUP_CONCAT()group_concat_max_lenGROUP_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

于 2013-03-17T15:35:48.063 回答
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>';
}
于 2013-03-17T15:35:39.690 回答
0

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

ORDER BY name

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

于 2013-03-17T15:36:50.547 回答