我有例如从查询返回的以下数据,每个名称都是一个项目:
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
答案 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_packet
或mysqli_
,因为它们提供多个查询选项。还可以看看 - 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,否则,将注释添加到当前列表的末尾。