wp_postmeta值的多列ORDER BY

时间:2015-02-23 14:05:45

标签: mysql sql wordpress

使用WordPress的WP_Query函数,我能够创建一个转换为以下SQL的查询;

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id )
INNER JOIN wp_postmeta AS mt2 ON ( wp_posts.ID = mt2.post_id )
INNER JOIN wp_postmeta AS mt3 ON ( wp_posts.ID = mt3.post_id )
WHERE 1=1 AND wp_posts.post_type = 'event'
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')
AND ( wp_postmeta.meta_key = 'core_event_year'
      AND ( mt1.meta_key = 'core_event_year'
      AND mt2.meta_key = 'core_event_month'
      AND mt3.meta_key = 'core_event_day' ) )
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value DESC LIMIT 0, 10 

但是,我需要能够为wp_postmeta表检索的3个元素添加排序顺序。由于可以忽略WP_Query函数并直接使用SQL语句,因此我意识到这是我必须采用的方法。

所以我的问题主要是关于如何调整上述SQL语句,使我能够将排序顺序应用于从wp_postmeta查询的3列中的每一列。目前,查询只是将全局DESC orderby子句应用于所有字段。

提前致谢。

2 个答案:

答案 0 :(得分:2)

只需在ORDER BY子句中包含您需要排序的列。看起来您有三个元数据列构成年,月和日。所以试试这个:

ORDER BY mt1.meta_value DESC, 
         mt2.meta_value DESC,
         mt3.meta_value DESC
LIMIT 0, 10 

现在看,meta_values是文本。您的月份和日期(mt2,mt3)值可能类似于' 1',' 2' ......' 10',' 11'在这种情况下,你必须欺骗MySQL认为你的价值观是数字,否则你的排序会变得很糟糕。这很简单:向文本值添加零。这会将您的文本强制转换为整数。 TRIM()函数摆脱了前导和尾随空格。

ORDER BY 0+TRIM(mt1.meta_value) DESC, 
         0+TRIM(mt2.meta_value) DESC,
         0+TRIM(mt3.meta_value) DESC
LIMIT 0, 10 

或者,正如Marcus建议的那样,您可以使用DATE对象进行排序。您可以使用以下三个元数据列创建日期对象:

 STR_TO_DATE(CONCAT_WS('-',
                       TRIM(mt1.meta_value),
                       TRIM(mt2.meta_value),
                       TRIM(mt3_meta_value)),
             '%Y-%m-%d)

CONCAT_WS将您的三个值变为' 2015-02-14'。然后,STR_TO_DATE(arg,'%Y-%m-%d')将该字符串转换为日期。

这很酷,因为你可以按它订购,如下:

 ORDER BY STR_TO_DATE(CONCAT_WS('-',
                       TRIM(mt1.meta_value),
                       TRIM(mt2.meta_value),
                       TRIM(mt3_meta_value)),
             '%Y-%m-%d) DESC

您也可以在具有日期算术的WHERE子句中使用它,例如....

 WHERE (thatBigDateExpression) >= NOW() - INTERVAL 2 MONTH

答案 1 :(得分:0)

您可以原生ORDER BY多列:

ORDER BY wp_postmeta.co1 DESC, wp_postmeta.co2 ASC, wp_postmeta.col3 ASC

ORDER BY info

相关问题