在META_QUERY中为QUERY_POST参数使用OR条件

时间:2013-06-24 作者:Devario Johnson

我到处寻找这个,但似乎什么也找不到。

我正在尝试筛选一些结果,当我创建这样的args数组并将其传递给query\\u post时,我注意到生成的SQL使用and而不是OR作为“class\\u 1\\u days”值。我想做一个比OR更好的。我该怎么做呢?(我在序列化数据时使用LIKE there,否则我会尝试“IN”并传递一个数组。正确的方法是什么?

$args = array(
            \'taxonomy\' => \'courses\', 
            \'term\' => \'drawing\', 
            \'post_type\' => \'school\', 
            \'paged\' => $paged,
            \'meta_query\' =>
                #$checkbox_array,
                array(
                    array(
                        \'key\' => \'instructor\',
                        \'value\' => \'1128\',
                        \'compare\' => \'LIKE\',
                    ),
                    array(
                        \'key\' => \'class_1_days\',
                        \'value\' => \'Friday\',
                        \'compare\' => \'LIKE\',
                    ),
                    array(
                        \'key\' => \'class_1_days\',
                        \'value\' => \'Saturday\',
                        \'compare\' => \'LIKE\',
                    ),
                )

        );
这是在我注意到和的地方生成的相关SQL

[138] => Array
    (
        [0] => SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  INNER JOIN     wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN     wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) WHERE 1=1  AND (     wp_term_relationships.term_taxonomy_id IN (18) ) AND wp_posts.post_type = \'school\' AND     (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\') AND (     (wp_postmeta.meta_key = \'instructor\' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE \'%1128%\')
AND  (mt1.meta_key = \'class_1_days\' AND CAST(mt1.meta_value AS CHAR) LIKE \'%Friday%\')
AND  (mt2.meta_key = \'class_1_days\' AND CAST(mt2.meta_value AS CHAR) LIKE \'%Saturday%\') ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 5

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

使用\'relation\' => \'OR\' as in the Codex example 以下内容:

$args = array(
    \'post_type\' => \'product\',
    \'meta_query\' => array(
        \'relation\' => \'OR\', /* <-- here */
        array(
            \'key\' => \'color\',
            \'value\' => \'blue\',
            \'compare\' => \'NOT LIKE\'
        ),
        array(
            \'key\' => \'price\',
            \'value\' => array( 20, 100 ),
            \'type\' => \'numeric\',
            \'compare\' => \'BETWEEN\'
        )
    )
);
$query = new WP_Query( $args );
那会给你一个OR 跨越所有meta\\u查询块。如果你需要的是WHERE "instructor" = 1128 AND (class_1_days = "value1" OR class_1_days = "value2") 如果您的数据没有序列化,那么像这样的操作就可以了。

$args = array(
        \'taxonomy\' => \'courses\', 
        \'term\' => \'drawing\', 
        \'post_type\' => \'school\', 
        \'paged\' => $paged,
        \'meta_query\' =>
            array(
                array(
                    \'key\' => \'instructor\',
                    \'value\' => \'1128\',
                    \'compare\' => \'LIKE\',
                ),
                array(
                    \'key\' => \'class_1_days\',
                    \'value\' => array(\'Friday\',\'Saturday\')
                    \'compare\' => \'IN\',
                )
            )

    );
考虑到您已经序列化了数据,这将很困难。您可以为posts_where 但我希望结果是低效的,而且容易出错。

根据我的经验,对于这种需要搜索/过滤/排序某些信息的情况,正确的方法是首先不要将数据存储为序列化数组。如果您需要这样的查询,那么这就是错误的方法。

如果我接管这个项目,我会以这种方式循环查询需要查询的数据,并将每个数据重新保存在一个键/值对中。您没有查询的部分可以保持序列化。在MySQL中,无论是作为您正在尝试的查询的一部分,还是作为一些独立查询,都没有(好的)方法可以做到这一点。我见过创建MySQL“unserialize”函数的尝试,但我看不出有什么意义。重新保存数据是一种方法。

它应该是一个相当简单的查询,以获取class_1_days 数据然后循环遍历它,将需要查询的部分保存为独立键,将其余部分作为序列化数据放回。

SO网友:Geza Gog

根据WordPress codex,嵌套数组可用于构造复杂查询。在您的示例中,您需要以下内容:

$args = array(
    \'taxonomy\' => \'courses\', 
    \'term\' => \'drawing\', 
    \'post_type\' => \'school\', 
    \'paged\' => $paged,
    \'meta_query\' =>
        array(
           \'relation\' => \'AND\', // default relation
            array(
                \'key\' => \'instructor\',
                \'value\' => \'1128\',
                \'compare\' => \'LIKE\',
            ),
            array(
                \'relation\' => \'OR\',
                array(
                    \'key\' => \'class_1_days\',
                    \'value\' => \'Friday\',
                    \'compare\' => \'LIKE\',
                ),
                array(
                    \'key\' => \'class_1_days\',
                    \'value\' => \'Saturday\',
                    \'compare\' => \'LIKE\',
                ),
            )
        )
); 

结束

相关推荐

查找并替换wp_post并忽略自定义POST类型MySQL查询

是否存在一些MYSQL查询来查找和替换wp\\U帖子,并忽略所有其他wordpress和buddypress帖子(buddypress文档)以及自定义帖子类型=公文包?我只想查找和替换wordpress博客内容,不想接触其他帖子。我使用以下MYSQL查询:UPDATE wp_posts SET post_content = REPLACE (post_content,\'Item to replace here\',\'Replacement text here\');

在META_QUERY中为QUERY_POST参数使用OR条件 - 小码农CODE - 行之有效找到问题解决它

在META_QUERY中为QUERY_POST参数使用OR条件

时间:2013-06-24 作者:Devario Johnson

我到处寻找这个,但似乎什么也找不到。

我正在尝试筛选一些结果,当我创建这样的args数组并将其传递给query\\u post时,我注意到生成的SQL使用and而不是OR作为“class\\u 1\\u days”值。我想做一个比OR更好的。我该怎么做呢?(我在序列化数据时使用LIKE there,否则我会尝试“IN”并传递一个数组。正确的方法是什么?

$args = array(
            \'taxonomy\' => \'courses\', 
            \'term\' => \'drawing\', 
            \'post_type\' => \'school\', 
            \'paged\' => $paged,
            \'meta_query\' =>
                #$checkbox_array,
                array(
                    array(
                        \'key\' => \'instructor\',
                        \'value\' => \'1128\',
                        \'compare\' => \'LIKE\',
                    ),
                    array(
                        \'key\' => \'class_1_days\',
                        \'value\' => \'Friday\',
                        \'compare\' => \'LIKE\',
                    ),
                    array(
                        \'key\' => \'class_1_days\',
                        \'value\' => \'Saturday\',
                        \'compare\' => \'LIKE\',
                    ),
                )

        );
这是在我注意到和的地方生成的相关SQL

[138] => Array
    (
        [0] => SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  INNER JOIN     wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN     wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) WHERE 1=1  AND (     wp_term_relationships.term_taxonomy_id IN (18) ) AND wp_posts.post_type = \'school\' AND     (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\') AND (     (wp_postmeta.meta_key = \'instructor\' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE \'%1128%\')
AND  (mt1.meta_key = \'class_1_days\' AND CAST(mt1.meta_value AS CHAR) LIKE \'%Friday%\')
AND  (mt2.meta_key = \'class_1_days\' AND CAST(mt2.meta_value AS CHAR) LIKE \'%Saturday%\') ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 5

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

使用\'relation\' => \'OR\' as in the Codex example 以下内容:

$args = array(
    \'post_type\' => \'product\',
    \'meta_query\' => array(
        \'relation\' => \'OR\', /* <-- here */
        array(
            \'key\' => \'color\',
            \'value\' => \'blue\',
            \'compare\' => \'NOT LIKE\'
        ),
        array(
            \'key\' => \'price\',
            \'value\' => array( 20, 100 ),
            \'type\' => \'numeric\',
            \'compare\' => \'BETWEEN\'
        )
    )
);
$query = new WP_Query( $args );
那会给你一个OR 跨越所有meta\\u查询块。如果你需要的是WHERE "instructor" = 1128 AND (class_1_days = "value1" OR class_1_days = "value2") 如果您的数据没有序列化,那么像这样的操作就可以了。

$args = array(
        \'taxonomy\' => \'courses\', 
        \'term\' => \'drawing\', 
        \'post_type\' => \'school\', 
        \'paged\' => $paged,
        \'meta_query\' =>
            array(
                array(
                    \'key\' => \'instructor\',
                    \'value\' => \'1128\',
                    \'compare\' => \'LIKE\',
                ),
                array(
                    \'key\' => \'class_1_days\',
                    \'value\' => array(\'Friday\',\'Saturday\')
                    \'compare\' => \'IN\',
                )
            )

    );
考虑到您已经序列化了数据,这将很困难。您可以为posts_where 但我希望结果是低效的,而且容易出错。

根据我的经验,对于这种需要搜索/过滤/排序某些信息的情况,正确的方法是首先不要将数据存储为序列化数组。如果您需要这样的查询,那么这就是错误的方法。

如果我接管这个项目,我会以这种方式循环查询需要查询的数据,并将每个数据重新保存在一个键/值对中。您没有查询的部分可以保持序列化。在MySQL中,无论是作为您正在尝试的查询的一部分,还是作为一些独立查询,都没有(好的)方法可以做到这一点。我见过创建MySQL“unserialize”函数的尝试,但我看不出有什么意义。重新保存数据是一种方法。

它应该是一个相当简单的查询,以获取class_1_days 数据然后循环遍历它,将需要查询的部分保存为独立键,将其余部分作为序列化数据放回。

SO网友:Geza Gog

根据WordPress codex,嵌套数组可用于构造复杂查询。在您的示例中,您需要以下内容:

$args = array(
    \'taxonomy\' => \'courses\', 
    \'term\' => \'drawing\', 
    \'post_type\' => \'school\', 
    \'paged\' => $paged,
    \'meta_query\' =>
        array(
           \'relation\' => \'AND\', // default relation
            array(
                \'key\' => \'instructor\',
                \'value\' => \'1128\',
                \'compare\' => \'LIKE\',
            ),
            array(
                \'relation\' => \'OR\',
                array(
                    \'key\' => \'class_1_days\',
                    \'value\' => \'Friday\',
                    \'compare\' => \'LIKE\',
                ),
                array(
                    \'key\' => \'class_1_days\',
                    \'value\' => \'Saturday\',
                    \'compare\' => \'LIKE\',
                ),
            )
        )
); 

相关推荐

如何将WordPress配置为与Microsoft SQL Server数据库对话?

我们正在我们的intranet站点上构建WordPress站点,并希望将其连接到Microsoft SQL Server。我已经在IIS上下载并配置了PHP和PHP管理器。我还从键入此线程标题时弹出的已回答问题列表中下载了SQL Server DLL。我按照指示在PHP文件夹中下载了这些DLL。当我启动服务器地址以安装WordPress时,系统会提示我提供SQL DB名称、用户名、密码和DB主机名。我还下载了wp-db抽象插件,将wp-db抽象化。php文件放入WordPress文件保存的文件夹中,按照我