php - Wordpress 自定义元查询搜索在 OR 关系中非常慢

标签 php mysql sql wordpress

我进行了一次搜索,基本上是查询自定义元字段并显示结果。由于某种原因,搜索需要花费无数个小时。当我将关系更改为“AND”时,它工作得很好,但是当我将关系更改为“OR”时,它就死了。

目前在数据库中我有 5 条记录,因此应该不会花费时间。

这是查询

$args = array(
  'post_type' => 'shipping-schedules', 
  'posts_per_page' => 5,
  'post_status' => 'publish',
  'paged' => $paged,
  'meta_query' => array(
  'relation' => 'OR',
    array(
      'key' => 'schedules_port',
      'value' => $sfrom,
      'compare' => 'LIKE'
    ),
    array(
      'key' => 'schedules_port',
      'value' => $sto,
      'compare' => 'LIKE'
    ),
    array(
      'key' => 'schedules_vessel',
      'value' => $svessel,
      'compare' => 'LIKE'
    ),
    array(
      'key' => 'schedules_voyage',
      'value' => $svoyage,
      'compare' => 'LIKE'
    ),
    array(
      'key' => 'schedules_arrival',
      'value' => $sdate_arrival,
      'compare' => '>=',
      'type' => 'NUMERIC'
    ),
    array(
      'key' => 'schedules_departure',
      'value' => $sdate_departure,
      'compare' => '<=',
      'type' => 'NUMERIC'
    )
  )
);

正如您在上面的查询中看到的,将这一行 'relation' => 'AND' 更改为 'relation' => 'OR' 将导致问题我面临着缓慢的查询。

最佳答案

我也发现了这个问题...但问题是我需要在我的特定情况下使用 OR 。

在阅读了大量信息后,例如对帖子元表值进行索引(这实际上听起来是个好主意,但我的代码在插件中,所以无法做到这一点),我找到了一种似乎运行相同的查询速度要快得多。

我不知道为什么,也没有开始深入研究,但不是使用过滤器 posts_where 进行 WP 元查询,而是自己修改 WHERE 子句,添加自己的内容论点..

这是我的代码:

add_filter('posts_where', array($this, 'filter_meta_query_where')); //modify the where clause to filter meta data
add_filter('posts_join' , array($this, 'filter_meta_join')); //join the meta table to the posts query

这是添加元查询的主要函数(我已经为 schedules_port 添加了条件,您必须按照自己想要的方式自行构建其余部分):

function filter_meta_query_where($where = '')
{
    global $wpdb; 
    global $wp_query;
    global $sf_form_data;

    if(!is_admin())
    {
        $where .= " AND (($wpdb->postmeta.meta_key = 'schedules_port' AND ($wpdb->postmeta.meta_value LIKE '%$sfrom%' OR $wpdb->postmeta.meta_value LIKE '%$sto%')))";
    }

    return $where;
}

这是连接的代码

function filter_meta_join($join)
{
     global $wpdb;

     $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";

     return $join;
}

希望有帮助

关于php - Wordpress 自定义元查询搜索在 OR 关系中非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23331762/

相关文章:

php - Doctrine 上的复杂 SQL 查询

Mysql查询选择只有字母字符的列

mysql - 在容器启动时启动服务

mysql - 二维 Excel 表转为 CSV 以进行 SQL 插入

python 读取单个 .db 文件作为 pandas 数据帧

mysql没有weekyear函数

PHP strtotime 将 false 保存为 MySQL 负整数

php - 如何将 php echo 与 html 表连接起来

php - mysqli_query不起作用。缺少连接?

MySQL条件可能吗?