我有一个租赁自定义帖子类型。租金有价格,价格存储在租赁表中。租赁还有一个元键“特色”。它的值为“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
在这个实际的查询中,我可以设法首先获得精选租赁,然后是其他人,但所有这些都按价格排序。 这应该更改,以便按日期排序。
答案 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