2017-02-20 43 views
1

我有租赁自定义帖子类型。租金有价格,价格存储在租赁表中。租金也有一个“特色”的元键。它具有“开”或“关”的值。如何通过WordPress中的不同元键进行订购

我需要做的是,列出租金,让特色优先,特色按日期排序,然后列出其他租赁,其他未特色租赁应按价格排序。

这是我的实际查询:

SELECT SQL_CALC_FOUND_ROWS wp_posts.*, 
    FROM wp_posts 
    INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
    INNER JOIN wp_st_rental as tb ON wp_posts.ID = tb.post_id 
    WHERE 1=1 AND 
    (wp_posts.ID NOT IN (SELECT object_id FROM wp_term_relationships 
    WHERE  term_taxonomy_id IN (253))) AND 
    (wp_postmeta.meta_key = 'is_featured') AND 
    wp_posts.post_type = 'st_rental' AND ((wp_posts.post_status = 'publish')) 
    AND wp_posts.ID IN (SELECT post_id FROM wp_st_location_relationships 
    WHERE 1=1 AND post_type IN ('st_rental')) GROUP BY wp_posts.ID 
    ORDER BY wp_postmeta.meta_value DESC, CAST(st_rental_price as DECIMAL) ASC 
    LIMIT 0, 350 

在这个实际的查询,我可以设法先拿到租金功能,然后其他人,但所有的人都通过价格排序。 这应该改变,所以特色按日期排序。

回答

0

你可以尝试用以下ORDER BY条款订购:

ORDER BY CASE WHEN wp_postmeta.meta_key = 'is_featured' THEN 0 ELSE 1 END, 
     CASE WHEN wp_postmeta.meta_key = 'is_featured' 
       THEN UNIX_TIMESTAMP(date_column)   -- integer number of seconds 
       ELSE CAST(st_rental_price AS UNSIGNED) END -- integer rental price 

在上述ORDER BY第二CASE表达假定日期列被称为date_column,因为我实际上并没有在原始查询看不到这似乎适合这一点。

第二个CASE表达式背后的逻辑是,对于精选的项目,它将按照从epoch开始的日期列中的整数秒数排序,否则它将按价格排序,视为无符号整数。

+0

这是我的最终解决方案: CASE WHEN wp_postmeta.meta_value '上',那么wp_posts.post_date END DESC =, CASE WHEN wp_postmeta .meta_value ='off'THEN CAST(act.price as DECIMAL)END ASC“; – Eva

0

您可以使用IF有条件地选择第二排序字段:

ORDER BY wp_postmeta.meta_value DESC, 
     IF(wp_postmeta.meta_value = 'on', the_date, CAST(st_rental_price as DECIMAL)) ASC 
+0

_所有来自给定'CASE'表达式的输出应该是相同的类型,这可能在MySQL中运行,但可能会失败,对于任何其他RDBMS 。 –

相关问题