2016-05-16 3 views
1

У меня SQL-запрос с левым соединением, который работает отлично. Однако у меня возникают трудности с заказом результатов.Как заказать SQL-запрос слева Присоединиться к результату

Запрос выглядит следующим образом:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) LEFT OUTER JOIN wp_posts recent ON recent.post_parent = wp_posts.ID AND recent.post_type = 'ticket_reply' AND recent.post_author = wp_posts.post_author WHERE 1=1 AND ((wp_postmeta.meta_key = '_wpas_status' AND CAST(wp_postmeta.meta_value AS CHAR) = 'open')) AND wp_posts.post_type = 'ticket' GROUP BY wp_posts.ID ORDER BY CASE WHEN recent.post_parent IS NULL THEN 0 ELSE 1 END, recent.post_date DESC, wp_posts.post_date DESC LIMIT 0, 20 

Запрос работает нормально и правильно отсортирован дата-накрест.

Однако записи, которые не находятся на пересечении (то есть записи типа ticket, у которых нет ticket_reply детей), отображаются последними. Мне нужны те, которые будут отображаться первыми, а затем отображать остальные по дате, как показано в исходном запросе.

Я не уверен, что этот запрос достаточно ясен. Если нет, сообщите мне, какие уточнения необходимы, и я сделаю все возможное, чтобы уточнить.

ответ

3

Попробуйте это:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
LEFT OUTER JOIN wp_posts recent 
    ON recent.post_parent = wp_posts.ID AND 
     recent.post_type = 'ticket_reply' AND 
     recent.post_author = wp_posts.post_author 
WHERE 1=1 AND wp_posts.post_type = 'ticket' 
GROUP BY wp_posts.ID 
ORDER BY CASE WHEN recent.post_parent IS NULL THEN 0 ELSE 1 END, 
     recent.post_date ASC, 
     wp_posts.post_date DESC 
LIMIT 0, 20 

Этот предикат recent.post_parent IS NULL идентифицирует несоответствующие записи. Выражение CASE возвращает значение 0 для этих записей и 1 для остальных записей. Следовательно, таким образом сначала будут отображаться несметные записи, а затем остальные записи.

+0

К сожалению, это не изменяет порядок. Тем не менее, я понимаю, что я мог оставить важную часть информации из исходного запроса: добавилось первое внутреннее соединение. Возможно, это изменяет поведение «ORDER BY». Я отредактировал исходный SQL-запрос. – Julien

+0

@Julien Можете ли вы опубликовать некоторые примеры данных, чтобы мы могли воспроизвести проблему? –

+0

Я точно не знаю, какой образец данных лучше всего использовать. Вот дамп моей таблицы wp_posts. Это происходит из среды моего dev, поэтому в нем может быть глупа или два. http://jmp.sh/AZyzf09 Идея состоит в том, чтобы сначала получить билеты без ответа («Мой третий билет» и «Мой первый билет»), а затем «Мой второй билет», на который есть ответ. – Julien

Смежные вопросы