如何在WordPress中按不同的元键排序

时间:2017-02-20 07:40:35

标签: mysql wordpress

我有一个租赁自定义帖子类型。租金有价格,价格存储在租赁表中。租赁还有一个元键“特色”。它的值为“on”或“off”。

我需要做的是,列出租金,以便特色排在第一位,特色按日期排序,然后列出其他租赁,其他非特色租赁应按价格订购。

这是我的实际查询:

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

在这个实际的查询中,我可以设法首先获得精选租赁,然后是其他人,但所有这些都按价格排序。 这应该更改,以便按日期排序。

2 个答案:

答案 0 :(得分: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

上面的CASE中的第二个ORDER BY表达式假设日期列名为date_column,因为我实际上没有在原始查询中看到任何符合此内容的内容。< / p>

第二个CASE表达式背后的逻辑是,对于特征项,它将按照自纪元以来的日期列中的整数秒来排序,否则它将按价格排序,视为无符号整数。

答案 1 :(得分:0)

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

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