2015-02-23 3 views
0

Использование функции WP_Query WordPress Я могу создать запрос, который переводится в следующий SQL;Multi column ORDER BY для значений wp_postmeta

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 

Однако, мне нужно, чтобы иметь возможность добавить порядка сортировки в 3-х элементов, извлекаемых для таблицы wp_postmeta. Поскольку можно игнорировать функцию WP_Query и напрямую использовать инструкцию SQL, я понимаю, что это метод, который мне нужно будет принять.

Итак, мой вопрос в основном о том, как приведенный выше оператор SQL может быть адаптирован, чтобы дать мне возможность применить порядок сортировки для каждого из 3 столбцов, запрошенных из wp_postmeta. В настоящее время запрос просто применяет обложку DESC orderby к всем полям.

Заранее спасибо.

+0

You может создать дату из трех столбцов, используя ['STR_TO_DATE()'] (http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_str-to- дата) и порядок. –

+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 

Или, как предположил Марк, вы могли бы использовать 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 (thatBigDateExpression) >= NOW() - INTERVAL 2 MONTH 
+0

Я уже адаптировал внутренний код, чтобы гарантировать, что месяцы были двузначными. ;-) –

+0

Это сработало. Большое спасибо Олли. –

+1

Добавлено объяснение использования 'STR_TO_DATE'. –

0

Вы можете изначально ORDER BY более одного столбца:

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

ORDER BY info

+0

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