ORDER BY category
を使用します 代わりは。次に、次のように結果セットを繰り返すことができます
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
更新
このスレッドには、これまで問題自体に対する3つの可能な解決策があります。
元のオプション1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
各親カテゴリを1回だけ取得する場合は、DISTINCT
を使用する必要があります。 代わりは。 GROUP BY
は使用しないでください 集計関数を使用せずに。 GROUP BY
を組み合わせる SELECT *
を使用 (ほとんど)MySQLに限定されています。この場合、ASNISQLでは任意の列を選択できません。
オプション1のバリエーション
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
これは、DISTINCT
で修正されたバージョンです。 GROUP BY
の代わりに 。
ネストされたクエリ呼び出しはまだありません。 5つの親カテゴリの場合、これによりループ内に5つのクエリが発生します。 10個の親カテゴリの場合、内部にはすでに10個のクエリがあります。一般的に、この種の成長は避ける必要があります。
オプション3
SELECT * FROM content ORDER BY category, menu_name
上記のコードで使用できます。
これは、さまざまな理由から、表示されている他のオプションよりも望ましい方法です。
- 一度にすべてのデータを収集するために必要なデータベースクエリは1つだけです。データベースは、提供されたSQLステートメントの解析にほとんどの時間を(簡単なクエリに)費やし、要求したデータを実際に収集するのにほんのわずかな時間しか費やしません。多くのSQLコードを提供する場合、それを解析するのに多くの時間を費やす必要があります。提供するコードが少なければ、やることも少なくなります。
- データベースでは、パーツを収集して並べ替え、パーツを返し、最初からやり直すよりも、データを1回取得し、1回並べ替えて、1回返す方が簡単です。
まだ述べられていないオプション4
これまで述べられていないさらなる解決策が存在します。プリペアドステートメントを使用して、SQLを一度準備できます。 異なるIDで実行します。これにより、ループ内のすべてのカテゴリにクエリが実行されますが、SQLコードを毎回解析する必要がなくなります。
実際、これが私のソリューションよりも良いか悪いか(またはその中間)はわかりません。