2017-02-20 2 views
1

У меня есть тип персонализированного типа аренды. В квартирах есть цены, цена хранится в таблице аренды. На арендной плате также есть мета-ключ «признакам». Он имеет значение «on» или «off».Как заказать по-разному мета-ключи в 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 

Второе CASE выражение в приведенном выше ORDER BY предполагает, что столбец дата называется date_column, потому что я на самом деле не вижу ничего в исходном запросе, который казалось, соответствовал этому.

Логика второго выражения CASE заключается в том, что для выделенных элементов он будет упорядочиваться целым числом секунд в столбце даты с эпохи, иначе он будет заказывать по цене, считаться целым числом без знака.

+0

Это было мое окончательное решение: случай, когда wp_postmeta.meta_value = 'на' THEN wp_posts.post_date END DESC, СЛУЧАЙ, КОГДА 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, но, вероятно, не будет работать для любой другой СУБД , –

Смежные вопросы