MySQL запрос упорядочить результаты в GROUP BY - PullRequest
2 голосов
/ 08 мая 2011

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

Вот мой запрос:

   SELECT SQL_CACHE users.user_id, 
          users.username, 
          topics.title, 
          topics.topic_id,
          topics.previews,
          topics.date_added,
          posts.post_id, 
          last.username AS last_username, 
          last.user_id AS last_user_id, 
          MAX( posts.post_id ) AS last_post_id,
          posts.date_added AS last_data
     FROM `topics`
LEFT JOIN `users` ON users.user_id = topics.user_id
LEFT JOIN `posts` ON ( posts.topic_id = topics.topic_id )
LEFT JOIN `users` AS last ON ( last.user_id = posts.user_id )
    WHERE fcat_id = '2'
 GROUP BY topics.topic_id

Ответы [ 5 ]

1 голос
/ 08 мая 2011

Вы можете сделать что-то вроде

SELECT *, `last`.`user_id` AS last_user_id FROM
(
    SELECT users.user_id, 
          users.username, 
          topics.title, 
          topics.topic_id,
          topics.previews,
          topics.date_added,
          posts.post_id, 
          MAX( posts.post_id ) AS last_post_id,
          posts.date_added AS last_data
         FROM `topics`
    LEFT JOIN `users` ON users.user_id = topics.user_id
    LEFT JOIN `posts` ON ( posts.topic_id = topics.topic_id )
        WHERE fcat_id = '2'
     GROUP BY topics.topic_id
 ) AS `tst`
LEFT JOIN `posts` ON ( posts.post_id = tst.last_post_id )
LEFT JOIN `users` AS `last` ON ( `last`.user_id = posts.post_id )

Просто правильно установите ваши выборки и, возможно, добавьте псевдоним для сообщений, которые находятся вне подзапроса

1 голос
/ 08 мая 2011

Способ работы SQL заключается в том, что после предложения WHERE создается временный набор результатов.Затем элементы из временного набора результатов группируются.

Это означает, что вы должны убедиться, что все элементы из временного набора результатов, сгруппированные в один конечный результат, имеют одинаковые значения для полей, которые выхочу иметь (т. е. все они являются «последним ответом, отображаемым в сгруппированных данных»).

Вместо GROUP BY я бы использовал подзапрос, который выбирает последние отображаемые ответы и передает ихк подходящему предложению WHERE.

1 голос
/ 08 мая 2011

Вы можете использовать как по группам, так и по заказам.Порядок будет применяться в каждой группе.

Так что GROUP BY themes.topic_id ORDER BY post.timestamp

(Я был немного обеспокоен, у меня был неправильный порядок параметров, но мы хорошиhttp://dev.mysql.com/doc/refman/5.5/en/select.html)

0 голосов
/ 09 мая 2011
Take it in two easy steps.


You want to find the most recent post in each category, and
then some info related to the post.

So first get the posts of interest:

    SELECT 
        MAX(topic_id) AS topic_id,
        post_id 
    FROM posts
    WHERE fcat_id = '2'
    GROUP BY topic_id

and then get "stuff" by adding on your joins:


SELECT
    tst.topic_id,
    tst.post_id,
    stuff
FROM
(
    SELECT 
        MAX(topic_id) AS topic_id,
        post_id 
    FROM posts
    WHERE fcat_id = '2'
    GROUP BY topic_id
) AS tst
LEFT JOIN users ...
LEFT JOIN topics ...
0 голосов
/ 08 мая 2011

Я думаю, что вам нужно упорядочить результаты по date_added и ограничить ваш результат до 1, чтобы он возвращал самую последнюю темуЯ надеюсь, что это указывает на правильное направление

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