1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Помогите с группировкой и сортировкой MYSQL

Тема в разделе "Программирование", создана пользователем telemaster, 27.11.07.

  1. telemaster

    telemaster Активный участник

    1.853
    10
    есть такой запрос:
    SELECT count(a.id) AS mes_num, a.topic, b.header, c.name, a.id, a.time, a.name AS username FROM forum a, news b, topics c WHERE a.visible='1' AND a.topic=b.id AND b.topic=c.id GROUP BY a.topic ORDER BY a.id DESC LIMIT 20

    есть три таблицы
    в одной хранятся все новости. она имеет уникальное поле topic
    в другой хранятся все сообщения из форума. она имеет уникальное поле id
    в третьей просто лежат названия разделов к которым принадлежат новости

    я делаю составную табличку и хочу чтобы у меня на выходе были 20 строк отсортироаных по дате последнего сообщения из форума по каждой теме. естественно перед этим производим группировку всех сообщений по topic который беру из табл. news.

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

    то есть:
    в теме А есть 100 постов первый из которых сделан во вторник, а последний в субботу.
    в теме Б есть 90 постов первый из которых был сделан в понедельник, а последний в пятницу.
    на первом месте в отданном MYSQL мне массиве данных я вижу тему Б, а на втором месте тему А.

    а надо наоборот. надеюсь смысл понятен.
     
  2. Penis PL/SQL

    Penis PL/SQL Гость


    1. mysql (если он не запущен в ansi-mode) достаточно фривольно относится к группировке, поэтому он может группировать по необъявленным в группировке полям. Естественно, значение такого поля в группе зависит от того, как карта ляжет :) В других базах Ваc бы послали читать мануалы, но mysql это ест :(
    2. Сделайте вот так (я предполагаю, что у Вас корелляция между id и time):
    SELECT
    count(*) AS mes_num, a.topic, b.header, c.name, MAX(a.id) as id, MAX(a.time) as time, a.name AS username
    FROM forum a, news b, topics c
    WHERE a.visible='1' AND a.topic=b.id AND b.topic=c.id
    GROUP BY a.topic, b.header, c.name, a.name
    ORDER BY id DESC LIMIT 20
    3. Если Ваша версия mysql 4.1 и старше, используйте подзапросы.
    4. Изучите документацию: http://dev.mysql.com/doc/