0

私はSQLクエリを持っています:

SELECT mealdesc, group_concat(fooddesc) as fooddesc 
FROM plan p
INNER JOIN mealplan mp
ON mp.planid = p.id
INNER JOIN meal m
ON m.id = mp.mealid
INNER JOIN foodmeal fm
ON fm.mealid = m.id
INNER JOIN food f
ON f.id = fm.foodid
where userid = 2
GROUP by mealdesc
order by mealdesc

結果は次のようになります。

mealdesc,fooddesc
Meal 1,"egg,egg whites,oatmeal,wheat toast,fruit,berries"
Meal 2,"Isolyze,raw nuts"
Meal 3,"chicken,turkey,yam,baked potato,veggies,medium salad"
Meal 4,"Isolyze,raw nuts"
Meal 5,"veggies,lean red meat,salmon,Chilean Sea Bass,large salad"
Meal 6,"veggies,large salad,Casein Protein,white fish"

group by と group_concat を削除すると、結果は次のようになります。

mealdesc,fooddesc
Meal 1,egg
Meal 1,egg whites
Meal 1,oatmeal
Meal 1,wheat toast
Meal 1,fruit
Meal 1,berries
Meal 2,Isolyze
Meal 2,raw nuts
Meal 3,veggies
Meal 3,medium salad
Meal 3,chicken
Meal 3,turkey
...and so on.

sqlステートメントでGroup byおよびGroup_Concatを実行し、区切り文字を処理してphp配列に入れるために爆発などを処理する必要がある代わりに、これと同じgroup byおよびgroup_concactロジックを実行し、これらすべてを整理する方法はありますかPHPで配列にプッシュしますか?

更新: これまでの応答に感謝します。これに PHP および HTML セクションを追加します。

私は基本的に、各食事を見出しとして出力し、各食品をリストに出力しようとしています。過去にexplodeを使用したことがありますが、配列を正しく形成できません。おそらくそれが私の問題です。

PHP コード:

$sql = "SELECT mealdesc, group_concat(fooddesc) as fooddesc 
    FROM plan p
    INNER JOIN mealplan mp
    ON mp.planid = p.id
    INNER JOIN meal m
    ON m.id = mp.mealid
    INNER JOIN foodmeal fm
    ON fm.mealid = m.id
    INNER JOIN food f
    ON f.id = fm.foodid
    where userid = 2
    GROUP by mealdesc
    order by mealdesc";

$result = mysqli_query($link, $sql);
if (!$result)
{
echo 'Error';
exit();
}


// Fetch food data
while($row = mysqli_fetch_assoc($result)){
$meals[] = array('mealdesc' => $row['mealdesc'], 'fooddesc' => explode(",", $row['fooddesc']));
}


echo '<pre>';
echo print_r($meals, true);
echo '</pre>';

次に、私のHTMLで、このようにループして、食事と食べ物の説明を出力します

<?php foreach ($meals as $meal): ?>
<h4><?php htmlout($meal['mealdesc']); ?></h4>
<ul>
  <li><?php htmlout($meal['fooddesc']); ?></li>
</ul>
<?php endforeach; ?>
4

2 に答える 2

1

SQL をそのように維持したい場合は、PHP で次のようにしてみませんか。

  while($row = dbOBj->Fetch($result))
    {
    $meal[$row['meal desc'][] = $row['food desc'];
    }

あなたはで終わるだろう$meal['Meal 1'] = array('egg', 'egg whites', ...)

于 2013-02-04T21:21:32.233 に答える
0

PDO を使用して、Prepared Statement を使用して上記のレコードセットを取得したと仮定します。

$meals = array();
while ($row = $stmt->fetch()) {
    $meals[$row[0]][] = $row[1];
}

これにより、次の形式が得られます。

array(
    "Meal 1" => array("egg","egg whites","oatmeal","wheat toast","fruit","berries"),
    "Meal 2" => array("Isolyze","raw nuts"),
    "Meal 3" => array("chicken","turkey","yam","baked potato","veggies","medium salad"),
    "Meal 4" => array("Isolyze","raw nuts"),
    "Meal 5" => array("veggies","lean red meat","salmon","Chilean Sea Bass","large salad"),
    "Meal 6" => array("veggies","large salad","Casein Protein","white fish"),
);

次に、次のようにして、希望する形式のいずれかを選択できます。

implode(",", $meals["Meal 1"]);

出力

egg,egg whites,oatmeal,wheat toast,fruit,berries

編集

上記のコードを見ると、おそらく HTML で次のことを行いたいと思うでしょう。

<?php foreach ($meals as $meal): ?>
<h4><?php htmlout($meal['mealdesc']); ?></h4>
<ul>
  <?php foreach ($meal['fooddesc'] as $d): ?>
  <li><?php htmlout($d); ?></li>
  <?php endforeach; ?>
</ul>
<?php endforeach; ?>
于 2013-02-04T21:21:14.040 に答える