使用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子句应用于所有字段。
提前致谢。
答案 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