MYSQL按查询顺序排列

时间:2014-09-22 22:06:57

标签: mysql wordpress woocommerce

如果我有自定义帖子类型(post_type),并且我想保证帖子类型为product的任何内容出现在搜索结果中的任何其他内容之前,我该如何实现?最好只改变查询的order by部分。

目前我有:

 ORDER BY posts.post_type DESC, posts.post_date DESC

这是有效的,但testimonial上的product的另一个帖子类型在DESC之前。在ASC上,articles之前有一个不同的自定义帖子类型product,但我需要先product(以post_date排序),然后其他所有内容 - 也是post_date订购的。

完整代码:

add_filter('posts_orderby','search_sort_custom',10,2);
function search_sort_custom( $orderby, $query )
{
    global $wpdb;

    if(!is_admin() && is_search()) {
        $orderby =  $wpdb->prefix."posts.post_type DESC, {$wpdb->prefix}posts.post_date DESC";

    }
   return  $orderby;
}

2 个答案:

答案 0 :(得分:1)

您可以在ORDER BY子句中使用表达式:

ORDER BY posts.post_type='product' DESC,
         posts.post_type DESC,
         posts.post_date DESC

如果您有更多要求,可以这样做:

ORDER BY posts.post_type='product' DESC,
         posts.post_type='testimonial' DESC,
         posts.post_type DESC,
         posts.post_date DESC

或使用FIND_IN_SET

ORDER BY FIND_IN_SET(posts.post_type,'product, testimonial'), 
         posts.post_type DESC,
         posts.post_date DESC

但理想情况下,我会将产品类型转移到另一个表格,并为每个类型提供一个优先级整数。这样您就可以完全控制订单而不会出现这样的剧情!

答案 1 :(得分:0)

你可以简单地做到

ORDER BY (
     posts.post_type = 'product' DESC, 
     posts.post_type DESC,
     posts.post_date DESC
)