MySql: нужен SQL-запрос для сортировки и группировки наборов записей в таблице по некоторым правилам - PullRequest
0 голосов
/ 13 февраля 2012

В MySql у меня есть таблица:

idPost | idPostParent | postText                              | dateCreated         |
1      | 1            |  This is parent post no1              | 2012-01-01 12:00:00 |
2      | 2            |  This is parent post no2              | 2012-01-02 13:00:00 |
3      | 1            |  This is first reply on idPost:1      | 2012-01-02 13:30:00 | 
4      | 4            |  This is parent post no3              | 2012-01-04 10:00:00 |
5      | 2            |  This is first reply on idPost:2      | 2012-01-04 11:00:00 |
6      | 1            |  This is second reply on idPost:1     | 2012-01-05 15:00:00 |
7      | 2            |  This is second reply on idPost:2     | 2012-01-06 17:00:00 |

ПРИМЕЧАНИЕ:

  1. Сообщение PARENT обнаруживается, если idPost = idPostParent
  2. ОТВЕТИТЬ сообщение удаляется, если idPost <> idPostParent и ответ связанные с постом, написанным в idPostParent

I нужен запрос SQL для сортировки и группировки наборов записей в таблице по некоторым правилам:

  1. Сообщения должны быть сгруппированы по idPostParent (родительский пост сначала, затем его отвечает)
  2. Последнее введенное сообщение РОДИТЕЛЯ ИЛИ последнее введенное сообщение должно быть вверху.

Результат должен быть:

idPost | idPostParent | postText                              | dateCreated         |
2      | 2            |  This is parent post no2              | 2012-01-02 13:00:00 |
5      | 2            |  This is first reply on idPost:2      | 2012-01-04 11:00:00 |
7      | 2            |  This is second reply on idPost:2     | 2012-01-06 17:00:00 |
1      | 1            |  This is parent post no1              | 2012-01-01 12:00:00 |
3      | 1            |  This is first reply on idPost:1      | 2012-01-02 13:30:00 |
6      | 1            |  This is second reply on idPost:1     | 2012-01-05 15:00:00 |
4      | 4            |  This is parent post no3              | 2012-01-04 10:00:00 |

ПРИЧИНА: Сообщение PARENT idPost = 2 содержит последнее введенное ответное сообщение, поэтому его тема должна быть в верхней части таблицы.

Спасибо всем, кто может внести свой вклад в решение!

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012

Это работает с вашими тестовыми данными

SELECT
posts.*
FROM posts
INNER JOIN 
  (
    SELECT idPostParent, MAX(dateCreated) as dateLastAnswer
    FROM posts
    GROUP by idPostParent
  ) AS pp ON posts.idPostParent=pp.idPostParent
ORDER BY pp.dateLastAnswer DESC, idPost ASC
2 голосов
/ 13 февраля 2012

Вот один из способов:

SELECT p.*
FROM posts p
LEFT JOIN
 (SELECT idPostParent, MAX(dateCreated) AS time_of_newest
  FROM posts
  GROUP BY idPostParent) p2
 ON p.idPostParent = p2.idPostParent
ORDER BY time_of_newest DESC, idPost=p.idPostParent DESC, dateCreated DESC

Пояснение:

Подзапрос

SELECT idPostParent, MAX(dateCreated) AS time_of_newest
  FROM posts
  GROUP BY idPostParent

выбирает максимальную дату, создаваемую для «нити» (idPostParent).

Это LEFT JOIN d для основной таблицы posts, так что каждый поток имеет time_of_newest для этого потока.

Мы сортируем по time_of_newest DESCENDING (это ставит нить 2 перед нитью 1 перед нитью 4).

Затем мы сортируем по idPost=idPostParent1 DESC, чтобы получить родительские посты перед ответами (родительские посты имеют здесь 1, а все ответы имеют 0, и, поскольку мы сортируем по убыванию родительские посты, идут первыми).

Наконец, мы сортируем по dateCreated DESC, чтобы получить ответы по порядку.

0 голосов
/ 13 февраля 2012

Как то так?

SELECT op.*, (SELECT MAX(ip.dateCreated) FROM posts ip WHERE ip.idPostParent = op.idPostParent) newestParentReply 
FROM posts op ORDER BY newestParentReply DESC, op.dateCreated ASC

Не проверял это. Он также будет работать ужасно, используя подзапрос, который должен выполняться для каждого сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...