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
子句中包含您需要排序的列。看起来您有三个元数据列,分别构成年、月和日。所以试试这个:
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
使用 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
子句中包含您需要排序的列。看起来您有三个元数据列,分别构成年、月和日。所以试试这个:
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