sql >> データベース >  >> RDS >> Mysql

mysqlの結果をカテゴリ別にグループ化し、各カテゴリの下のグループに表示します

    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コードを毎回解析する必要がなくなります。

    実際、これが私のソリューションよりも良いか悪いか(またはその中間)はわかりません。



    1. MySQL Update Incremented(Auto-Incrementedではない)列の値

    2. PHP、ORM、MSSQL、Unicode、これらを一緒に機能させることは可能ですか?

    3. Python:MySQLに接続してクエリを実行するためのベストプラクティスと最も安全な方法

    4. ここでEXECUTEIMMEDIATEが必要なのはなぜですか?