【问题标题】:MYSQL order by queryMYSQL 按查询排序
【发布时间】:2014-09-22 22:06:57
【问题描述】:

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

目前我有:

 ORDER BY posts.post_type DESC, posts.post_date DESC

这可行,除了 DESC 上的 product 之前的另一个帖子类型 testimonial。在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;
}

【问题讨论】:

    标签: mysql wordpress woocommerce


    【解决方案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
    

    不过,理想情况下,我会将产品类型转移到另一个表中,并为每种类型指定一个优先整数。这样您就可以完全控制订单,而不会发生这种戏剧性事件!

    【讨论】:

    • 谢谢,我可以这样做:post_type='product' DESC,posts.post_type!='product' DESC,posts.post_date DESC
    • 抱歉,您仍然是保留分组的旧表达式.. 请参阅更新。比较返回 1 或 0(真/假),因此您的建议与我原来的建议相同。
    • 谢谢 Arth ...所以这将返回所有按 post_date DESC 订购的产品,其他所有产品(混合在一起)按 post_date DESC 订购。如果是这样,太棒了,因为这就是我所追求的。
    • 第一个似乎有效,虽然我真的不明白。如果我在第一行将 DESC 更改为 ASC,事情就会完全崩溃。 DESC 在前两行的目的是什么?我了解最后一个 DESC 的原因(在 post_date)。
    • 比较返回 1 或 0(真/假),在 post_type='product' 这将返回 1 并以 DESC 为优先级的行上,所有其他行将返回 0 并紧随其后。接下来的两行是您的原始订单,因此在产品中,订单将是“产品”DESC(都一样),然后是日期。其他(非产品)将按其类型 DESC 以及这些类型组中的日期排序。
    【解决方案2】:

    你可以简单地做

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

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2014-12-09
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多