4

次のようなテーブルがあります。

グループ数
タグ1、タグ2 23
タグ1、タグ2、タグ3 12
タグ2、タグ3 10

次のようなテーブルを作成したい:

タグ数
タグ1 35
タグ2 45
タグ3 22

基本的に、最初のテーブルで文字列を分割し、出現回数を数えてから新しいテーブルに挿入したいと考えています。MySQL で文字列を分割することがますます難しくなっています。結果を PHP に渡してそこで作業することは気にしませんが、テーブルは 32000 行あり、何らかの理由で PHP プロセスが無期限の SLEEP モードに入ります。

そのため、純粋な SQL コマンドを使用してこれを達成する方法についての指針をいただければ幸いです。

4

1 に答える 1

4

これは SQL で行うことができますが、いくつかのトリックが必要です。次のようにして、リスト内の文字列のn 番目の要素を抽出できます。

select reverse(substring_index(reverse(substring_index(list, ', ', n)), ',', 1))

最も内側substring_index()は、n 番目の項目まですべてを取得します。次に、文字列を逆にして最初の項目を取得します。最後に、もう一度逆にして、もう一方の逆を元に戻します。

2 番目のトリックは、 a を実行してcross join数値のリストを取り込むことです。リストには最大で 3 つの要素があるため、リストには最大で 3 つ必要です。サンプル クエリでは、 を使用union allして数値をまとめることでこれを行います。ある種の数値表があるかもしれません。

最後のステップは、データを集約して合計することです。

select tag, SUM(count)
from (select reverse(substring_index(reverse(substring_index(group, ', ', n.n)), ',', 1)) as tag, count
      from t cross join
           (select 1 as n union all select 2 union all select 3
           ) n
      where n.n <= 1+(length(GROUP) - length(replace(group, ',', '')))
     ) t
group by tag

クエリ内のすべてをバッククォートしませんでした。一般に、 SQL の予約語であるcountやのような列を使用することはお勧めできません。group

于 2013-05-07T14:40:48.103 に答える