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

これはMySQLクエリで実行できますか、それともPHPで実行する必要がありますか? (サーバ側)

    これはsqlで実行できます 。 1つの方法は、joinできる整数のみの「ヘルパーテーブル」を使用することです。 データに対して、行を数回取得してから、nだけを抽出します。 -番目のサブ要素。

    これを試してください:

    -- helper table with a listof integers from 1 to 10
    create table _int_1_10 (id int primary key);
    insert into _int_1_10 (id) 
    values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
    
    -- some example data 
    create table test_strexplode (
       id int primary key, 
       space_value_1 varchar(200),
       space_value_2 varchar(200)
    );
    
    insert into test_strexplode (id, space_value_1, space_value_2)
    values (1, 'row 1', 'March 3,March 5,March 6 March 1,March 2 Feb 27'),
           (2, 'row 2', 'March 3,,March 5'),
           (3, 'row 3', '');
    
    select space_value_1, 
      _int_1_10.id,
      -- extracts the "_int_1_10.id"th element
      SUBSTRING_INDEX(SUBSTRING_INDEX(
           space_value_2,',',_int_1_10.id),',',-1) as subentry
    from test_strexplode
    join _int_1_10 
    on _int_1_10.id <= 
       -- number of elements in your string (= number of "," + 1)
       char_length(space_value_2) - char_length(replace(space_value_2, ',', '')) + 1
    order by test_strexplode.id, _int_1_10.id;
    

    これにより、次のことが可能になります:

    +---------------+----+-----------------+
    | space_value_1 | id | subentry        |
    +---------------+----+-----------------+
    | row 1         | 1  | March 3         | 
    | row 1         | 2  | March 5         |
    | row 1         | 3  | March 6 March 1 |
    | row 1         | 4  | March 2 Feb 27  |
    | row 2         | 1  | March 3         |
    | row 2         | 2  |                 |
    | row 2         | 3  | March 5         |
    | row 3         | 1  |                 |
    +---------------+----+-----------------+
    

    ,が欠落しているサンプルデータを使用しました 、これが結果に含まれる理由です。 March 2 Feb 27 。また、一部のサブエントリが空であることに注意してください(私のサンプルデータには空のエントリが含まれているため)。それらを除外する場合としない場合があります。整数テーブルには、少なくとも、行に含まれると予想される要素の最大数までの数値が含まれている必要があります(0が含まれている場合)。 または負の数の場合は、onで除外します -節)。

    substring_index(str,delim,count) 文字列strから部分文字列を返します countの前 区切り文字delimの出現 。 subentryの完全なステートメント 正の数の場合、_int_1_10.idのいずれかを返します -番目の要素、または文字列の要素が少ない場合は最後の要素。

    on -clauseは、要素の数を計算します(,の数を数えることによって) )最後の要素を数回取得しないようにします。文字列に空の要素(,,など)が含まれていない場合 私のサンプルデータでは)、その部分は必要ありませんが、リストの終わりを示すために空の要素を追加することができます。

    このコードを結果セット全体に適用できます。を使用して

    ...
    from (select ... 
             space1_1_value as space_value_1,
             space1_2_value as space_value_2
          ...
          union all ... union all ... ) as test_strexplode 
    join _int_1_10 ...
    

    動作しますが、遅い場合があります。 space*_2_valueのインデックスは使用できません -列と多くの結合と文字列評価を行う必要があります。ただし、データを正規化する以外は、それについて多くのことを行うことはできません。

    sqlでこれを行うと便利な場合 おそらく、データをどのように処理しているかによって異なります。 Webページのhtmlテーブルに表示するだけの場合は、 phpの配列をループするだけの方が簡単で高速な場合があります。 。並べ替え、フィルタリング、またはjoin 結果セットの場合、 sql での実装はおそらくはるかに簡単です(おそらく高速です)。 、おそらくフレームワークで使用している場合でも。値を更新する場合は、 phpで行う方がはるかに簡単です。 、 sqlで混乱する可能性が高いため (この結果セット上)




    1. Oracle11gからPostgresql8.4へのトリガーの移行

    2. node.js-sqlでパラメータをバインドして動的クエリを構築するにはどうすればよいですか?

    3. Oracleで特定の時間にセッションが消費するCPUの量

    4. Postgresで列を複数の行に分割する