Mysge组由Regex匹配值

时间:2016-05-26 15:03:06

标签: mysql database wordpress advanced-custom-fields

我正在试图弄清楚如何通过我的一个列的值将我的结果从Mysql查询中分组。有问题的数据库/表是WordPress选项表,其中包含以下列:

  • option_id
  • OPTION_NAME
  • 请将option_value
  • 自动加载

我设置了ACF转发器字段来容纳一系列州和城市。不幸的是,我列出了超过5000个城市,并且ACF通过对每个城市使用单个查询来工作,导致可疑的高查询计数和页面加载。我正在尝试使用直接数据库调用来优化我的函数以减少查询数量,而我几乎就在那里,我无法弄清楚如何正确地对数据进行分组。我现在要做的是在一次通话中从数据库中获取所有状态及其相关信息。我有以下我想要获得的值:

  • 州名
  • 州名缩写
  • State Slug

ACF将这些值存储在选项表中,每个值都在其自己的条目中,并且具有略微匹配的选项名称。对于我添加的每个州,使用以下option_name值将三个条目添加到选项表中:

  • options_states_0_state_name
  • options_states_0_state_abbreviation
  • options_states_0_state_slug

随着更多状态的添加,数字会增加。我需要获取每个州的所有信息(我们在数据库中列出了51个,每个都有三个条目,总共需要检索的153条记录)。我设法设置了一个查询,如下所示获取信息,但它没有对它进行分组:

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

我需要按条目中间的数字(在这种情况下为0)对条目进行分组,而不是按顺序列出它们。我希望返回51个结果而不是153个结果,每个结果应该是一个包含州名,州名缩写和状态slug的数组。如何按值名称中间的数字对值进行分组?我附上了数据库结构和查询结果的屏幕截图,以便更清晰。

screenshot of current query results

为清晰起见编辑:

在一天结束时,我希望返回一个像这样的结构:

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...
)

每个单独的状态应该有自己的数组,其中包含上面的三个值,按键中间出现的数字分组。我不介意它是否是标准数组而不是关联。我只需要正确分组所有内容。

1 个答案:

答案 0 :(得分: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