Не могу сделать ORDER BY перед GROUP BY

221
28 февраля 2017, 16:14

Подскажите почему два запроса выдают разные результаты?

1-ый запрос:

SELECT date, text, topic_id 
FROM forum_msgs 
ORDER BY topic_id,date DESC

и 2-ой запрос:

SELECT * 
FROM (SELECT date, text, topic_id 
      FROM forum_msgs 
      ORDER BY topic_id,date DESC
    ) t1

2-ой запрос выдаёт неотсортированную таблицу и поэтому запрос, который приведен ниже уже не имеет смысла.

SELECT * 
FROM (SELECT date, text, topic_id 
      FROM forum_msgs 
      ORDER BY topic_id,date DESC
    ) t1 
GROUP BY topic_id
Answer 1

Спасибо Mike - подсказал то что и было нужно. Итоговый запрос конечно немного сложнее, но основа легла на ура.

SELECT t1.parent_id, t1.id id,
                   t1.name,
                   t2.*
            FROM forum_dirs t1 LEFT JOIN (
                SELECT 
                    forum_topics.title, 
                    forum_topics.dir_id,
                    forum_topics.id topic_id, 
                    forum_topics.date topic_date,
                    forum_topics.user_id topic_user_id, 
                    users.logo topic_user_logo,
                    users.name topic_user_name, 
                    users.login topic_user_login,
                    t3.*
                FROM forum_topics LEFT JOIN users ON users.id=forum_topics.user_id 
                LEFT JOIN (
                    SELECT 
                        forum_msgs.text, 
                        forum_msgs.user_id msg_user_id,
                        forum_msgs.date msg_date,
                        forum_msgs.topic_id msg_topic_id,
                        users.logo msg_user_logo,
                        users.name msg_user_name, 
                        users.login msg_user_login 
                    FROM forum_msgs 
                    LEFT JOIN users ON users.id=forum_msgs.user_id 
                    WHERE (topic_id, date) IN (SELECT topic_id, max(date) FROM forum_msgs GROUP BY topic_id)
                ) t3 ON t3.msg_topic_id=forum_topics.id
                WHERE (dir_id, date) IN (SELECT dir_id, max(date) FROM forum_topics GROUP BY dir_id)
            ) t2 ON t2.dir_id=t1.id
Answer 2

Наверное потому, что во втором случае вы делаете выборку из выборки. выборка идет опять в том порядке, как удобно оптимизатору. А почему не использовать group by в том же выражении, что и order by? Они вполне могут сосуществовать в одной выборке.

READ ALSO
Вывод double в файл в java

Вывод double в файл в java

Мне надо выводить числа типа double в файл, а также читать их оттудаОднако при попытке чтения выведенных чисел у меня возникает ошибка:

313
Не проверяется цифровая подпись

Не проверяется цифровая подпись

Подписываю текстовое сообщение на закрытом RSA ключе, потом перевожу эту подпись в Base64, потом обратно и проверяю её на открытом ключеПочему...

203