【问题标题】:Mysql group by Regex match value正则表达式匹配值的Mysql组
【发布时间】:2016-09-24 16:17:43
【问题描述】:

我正试图弄清楚如何根据我的一列的值对 Mysql 查询的结果进行分组。有问题的数据库/表是 WordPress 选项表,它具有以下列:

  • option_id
  • 选项名称
  • option_value
  • 自动加载

我设置了一个ACF 转发器字段来保存一系列州和城市。不幸的是,我列出了 5000 多个城市,而 ACF 对每个城市使用一个查询,导致查询次数和页面加载量高得离谱。我正在尝试使用直接数据库调用来优化我的函数以减少查询的数量,而且我快到了,我只是不知道如何对我的数据进行适当的分组。我现在要做的是在一次调用中从数据库中获取所有状态及其相关信息。我想获得以下值:

  • 州名
  • 州缩写
  • 状态弹

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 个,并且每个结果应该是一个包含状态名称、状态缩写和状态段的数组。如何按值名称中间的数字对值进行分组?为了更清楚,我附上了数据库结构和查询结果的屏幕截图。

为清楚起见编辑:

归根结底,我希望返回这样的结构:

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

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

【问题讨论】:

    标签: mysql database wordpress advanced-custom-fields


    【解决方案1】:

    解决了我自己的问题。对于将来可能遇到此问题的任何人,我最终发现您无法从 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"
    

    它有点乱,但它可以完成工作并且运行得相当快。这是输出的屏幕截图:

    【讨论】:

      猜你喜欢
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多