Mysql 按正则表达式匹配值分组

标签 mysql database wordpress advanced-custom-fields

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

  • 选项 ID
  • 选项名称
  • 选项值
  • 自动加载

我有一个ACF中继器场设置可容纳一系列州和城市。不幸的是,我列出了 5000 多个城市,而 ACF 的工作方式是对每个城市使用单个查询,从而导致查询计数和页面加载量高得离谱。我正在尝试使用直接数据库调用来优化我的函数以减少查询数量,而且我几乎已经完成了,我只是不知道如何适本地对我的数据进行分组。我现在想做的是通过一次调用从数据库获取所有状态及其相关信息。我想要获得以下值:

  • 州名称
  • 国家缩写
  • 状态蛞蝓

ACF 将这些值存储在选项表中,每个值都在其自己的条目中,并具有稍微匹配的选项名称。对于我添加的每个状态,选项表中都会添加三个条目,其中包含以下 option_name 值:

  • options_states_0_state_name
  • options_states_0_state_abbreviation
  • options_states_0_state_slug

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

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

我需要按条目中间的数字(在本例中为 0)对条目进行分组,而不是仅按顺序列出它们。我希望返回 51 个结果而不是 153 个,每个结果应该是一个包含州名称、州缩写和州名称的数组。如何按值名称中间的数字对值进行分组?为了更清楚起见,我附上了数据库结构和查询结果的屏幕截图。

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

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

最佳答案

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

关于Mysql 按正则表达式匹配值分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37464599/

相关文章:

mysql - SQL附加其他表的行

java - Spring Boot native 查询抛出错误,但在mysql中有效

mysql - MySQL 8中基于多个值过滤掉重复数据

database - 如何在H2数据库中使用FULL-TEXT SEARCH?

css - WordPress z-index 也许

php - SQL DATE 和 TIME 到 DATETIME

mysql - 从 .sql 文件顺序调用存储过程

mysql - 如何在 mac os Sierra 中将 mysql 表转储到 csv 文件中?

php - 使用 Redux 更新 wordpress blogname 和 blogdescription

css - 无法解决 woocommerce 购物车页面标题中的红色下划线