ORDER BY в MYSQL с условием использования возврата функции

я искал решение; запрос:

            SELECT MAX(forum_commenti.Data) AS MData, forum_post.id AS id, forum_post.Nome AS Nome, forum_post.Messaggio AS Messaggio, forum_post.Sezione AS Sezione, forum_post.Data AS Data, forum_post.Utente AS Utente, forum_post.Chiuso AS Chiuso, forum_post.Importante AS Importante
FROM forum_post LEFT OUTER JOIN forum_commenti ON forum_post.id = forum_commenti.Post
WHERE forum_post.Importante = 0
AND forum_post.Sezione = '".$_GET['id']."'
GROUP BY id, Nome, Messaggio, Sezione, Data, Utente, Chiuso, Importante
ORDER BY MData IS NOT NULL DESC, Data DESC
LIMIT $start, $per_page

Это запрос для форума; Я пытаюсь отобразить порядок сообщений для данных. Мое желание будет:

  • Если сообщение не отвечает, закажите это сообщение, используя его собственную дату, иначе используйте дату последнего комментария для этого сообщения. (другая информация бесполезна)

Я искал старые вопросы, решенные о чем-то вроде этого, но это доставляло мне проблемы, когда я пытался сделать так:

ORDER BY MData IS NOT NULL DESC, Data ASC

Это говорит «Ссылка ‘MData’ не поддерживается (ссылка на групповую функцию)».

Я использую этот запрос для функции PHP.

Таблицы, включенные в запрос:

  • forum_post: Содержит все сообщения форума
  • forum_commenti: содержит все ответы на все сообщения, используя ‘Post’ в качестве внешнего ключа forum_post

Условие WHERE — бесполезная точка для запроса.

Я покажу вам пример:

ПОСТ 1 | Данные последнего ответа 19.12.2014 10:00:00, данные поста 19.12.2014 09:00:00
Взять данные последнего комментария

ПОСТ 2 | Данные последнего ответа — NULL (не получил ответов), Данные поста — 19.12.2014 08:00:00
Взять данные поста

…….
…….
так далее

Теперь, когда у меня есть что-то подобное:

ПОСТ 1 | 19/12/2014 10:00:00

ПОСТ 2 | 19/12/2014 08:00:00

ЗАКАЗАТЬ ПО ДАННЫМ

Спасибо всем за помощь.

2

Решение

Это работает при использовании подзапроса, который сначала выбирает сообщения вместе с датой последнего комментария. Затем результат можно отсортировать по выражению в этих двух столбцах. я использовал IFNULL(last_post_date, own_date) чтобы выбрать правильную дату, а также сделать это доступным в effective_date колонка для дидактических целей:

SELECT *, IFNULL(last_post_date, own_date) AS effective_date
FROM (
SELECT
forum_post.post_id,
forum_post.date AS own_date,
MAX(forum_comment.date) AS last_post_date
FROM forum_post
LEFT OUTER JOIN forum_comment
ON (forum_post.post_id = forum_comment.post_id)
GROUP BY post_id
) posts
ORDER BY effective_date DESC;

Обратите внимание, что я использовал немного другую настройку таблицы в своем ответе, потому что исходные определения таблицы были недоступны, но она также будет работать с любой другой настройкой таблицы. Вот мои примеры таблиц:

CREATE TABLE `forum_post` (
`post_id` int(11) NOT NULL AUTO_INCREMENT,
`date` datetime DEFAULT NULL,
PRIMARY KEY (`post_id`)
);
CREATE TABLE `forum_comment` (
`comment_id` int(11) NOT NULL AUTO_INCREMENT,
`post_id` int(11) DEFAULT NULL,
`date` datetime DEFAULT NULL,
PRIMARY KEY (`comment_id`)
);

Я использовал следующие данные примера для тестирования:

forum_post.

+---------+---------------------+
| post_id | date                |
+---------+---------------------+
|       1 | 2014-12-01 00:00:00 |
|       2 | 2014-12-02 00:00:00 |
|       3 | 2014-12-02 00:00:00 |
|       4 | 2014-12-03 00:00:00 |
|       5 | 2014-12-03 00:00:00 |
|       6 | 2014-12-04 00:00:00 |
|       7 | 2014-12-06 00:00:00 |
|       8 | 2014-12-09 00:00:00 |
+---------+---------------------+

forum_comment:

+------------+---------+---------------------+
| comment_id | post_id | date                |
+------------+---------+---------------------+
|          1 |       1 | 2014-12-01 00:00:00 |
|          2 |       1 | 2014-12-02 00:00:00 |
|          3 |       1 | 2014-12-03 00:00:00 |
|          4 |       2 | 2014-12-23 00:00:00 |
|          5 |       3 | 2014-12-09 00:00:00 |
|          6 |       3 | 2014-12-15 00:00:00 |
|          7 |       5 | 2014-12-15 00:00:00 |
|          8 |       7 | 2014-12-09 00:00:00 |
|          9 |       7 | 2014-12-11 00:00:00 |
+------------+---------+---------------------+

С этими данными запрос возвращает следующий результат:

+---------+---------------------+---------------------+---------------------+
| post_id | own_date            | last_post_date      | effective_date      |
+---------+---------------------+---------------------+---------------------+
|       2 | 2014-12-02 00:00:00 | 2014-12-23 00:00:00 | 2014-12-23 00:00:00 |
|       3 | 2014-12-02 00:00:00 | 2014-12-15 00:00:00 | 2014-12-15 00:00:00 |
|       5 | 2014-12-03 00:00:00 | 2014-12-15 00:00:00 | 2014-12-15 00:00:00 |
|       7 | 2014-12-06 00:00:00 | 2014-12-11 00:00:00 | 2014-12-11 00:00:00 |
|       8 | 2014-12-09 00:00:00 | NULL                | 2014-12-09 00:00:00 |
|       6 | 2014-12-04 00:00:00 | NULL                | 2014-12-04 00:00:00 |
|       4 | 2014-12-03 00:00:00 | NULL                | 2014-12-03 00:00:00 |
|       1 | 2014-12-01 00:00:00 | 2014-12-03 00:00:00 | 2014-12-03 00:00:00 |
+---------+---------------------+---------------------+---------------------+
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]