2016-05-26 9 views
0

私の結果をMysqlクエリからグループ化する方法を、自分のカラムの値で調べようとしています。問題のデータベース/テーブルには、次の列がありWordPressのオプションテーブル、次のとおりです。正規表現でのMysqlグループの一致値

  • はoption_id
  • OPTION_NAME
  • option_value
  • のautoload

私はACFリピータフィールドが設定されています一連の州と都市を保持する残念ながら、私は5000以上の都市をリストアップしており、ACFは都市ごとに1つのクエリを使用しているため、クエリのカウント数やページの負荷が非常に高くなっています。クエリの数を減らすために直接DB呼び出しを使用して関数を最適化しようとしていますが、私はほとんどそこにいるので、データを適切にグループ化する方法がわかりません。私が今しようとしているのは、すべての州とそれに関連する情報をDBから1回の呼び出しで得ることです。

  • 都道府県名
  • 状態の略
  • 州スラッグ

ACFオプションテーブルでこれらの値を格納し、それぞれが独自のエントリに:私は私が取得しようとしている次の値を持っていますわずかに一致するオプション名を使用します。私は追加する各状態について、3つのエントリは、次のOPTION_NAME値とオプションのテーブルに追加されます。

  • options_states_0_state_name
  • options_states_0_state_abbreviation
  • options_states_0_state_slug以上の状態として、最大インクリメント

番号が追加されます。私はすべての州のすべての情報を取得する必要があります(私たちのデータベースには51のレコードがあり、それぞれに3つのエントリがあり、合計で153レコード必要です)。私は情報を取得され、次のようにクエリを設定するために管理し、それがグループにそれをしません:私は(この場合は0)、エントリの真ん中に数でグループに私のエントリを必要とする

select option_name, option_value from wp_options where 
option_name REGEXP '^options_states_.+_state_.+$'; 

、単に順番に並べるのではなく、私は、153の代わりに51の結果を返したいと思います。それぞれの結果は、状態名、状態の省略形、および状態のスラッグを含む配列でなければなりません。値を値の中央にある数値でグループ化するにはどうすればよいですか? DB構造のスクリーンショットとクエリ結果を添付しました。

screenshot of current query results

明確にするためEDIT:

日の終わりに、私はこのような構造を持つようにしたい返さ:

array(
    array(
    'options_states_0_state_name' => 'Alabama', 
    'options_states_0_state_abbreviation' => 'AL', 
    'options_states_0_state_slug' => 'al', 
), 
    array(
    'options_states_1_state_name' => 'Alaska', 
    'options_states_1_state_abbreviation' => 'AK', 
    'options_states_1_state_slug' => 'ak', 
), 
    etc... 
) 

を個々の状態は、それ自身の配列含むが必要です上記の3つの値は、キーの中央に表示される番号でグループ化されています。私はそれが連想の代わりに標準的な配列であれば気にしない。私はすべてを正しくグループ化する必要があります。

答えて

0

解決しました。将来これに遭遇するかもしれない人のために、MySQLでネイティブにREGEXP式から一致する値を返すことができないことを知りました。代わりに、文字列比較関数を使用して必要な値をトリムし、必要な各値を得るためにいくつかの内部結合を実行しなければなりませんでした。ここで私が使用するSQLコードです:それは少し厄介だ

SELECT 
first.option_value as state_name, 
second.option_value as state_abbreviation, 
third.option_value as state_slug 
from tsd_cm_options as first 
inner join tsd_cm_options as second on second.option_name = CONCAT('options_states_',SUBSTRING_INDEX(SUBSTRING_INDEX(first.option_name, 'options_states_', -1), '_state_name', 1),'_state_abbreviation') 
inner join tsd_cm_options as third on third.option_name = CONCAT('options_states_',SUBSTRING_INDEX(SUBSTRING_INDEX(first.option_name, 'options_states_', -1), '_state_name', 1),'_state_slug') 
where first.option_name like "options_states_%_state_name" 

が、それは仕事を取得し、かなり迅速に実行されます。出力のスクリーンショットは次のとおりです。

enter image description here