wp_postmeta 值的多列 ORDER BY

Multi column ORDER BY for wp_postmeta values

使用 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 table 检索到的 3 个元素添加排序顺序。由于可以忽略 WP_Query 函数并直接使用 SQL 语句,我意识到这是我必须采用的方法。

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

提前致谢。

您可以原生 ORDER BY 多列:

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

ORDER BY info

只需在 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