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があり、LIを使用するDIVに表示されます。

ご覧のとおり、「アイテム」に対して複数のコメントがあり、それぞれが別の行にある場合があります

私がやりたいのは、各アイテムを表示し、各アイテムの下にコメントがあれば表示することです。したがって、コメント セクションは一意であるため、クエリ段階では何​​もグループ化できませんが、表示段階でグループ化する必要があります

したがって、現在持っている:

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

}

これは、同じアイテムに対して複数の表示が生成され、それぞれの下に 1 つのコメントが表示されるため、これは適切ではありません。

これを行うことはできますか、それとも別の方法でデータを取り込む必要がありますか?

理想的な結果は例えば

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

3 に答える 3

2

mysql クエリで使用GROUP_CONCAT()して、名前ごとにすべてのコメントをグループ化できます

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()使用できます。関数 (減価償却されている) から変更し、複数のクエリ オプションを提供するように変更することをお勧めします。もチェックしてください - http://php.net/manual/en/mysqlinfo.api.choosing.phpSET SESSION ...max_lenmysql_mysqli_PDO

于 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 に答える