За последние 24 часа нас посетили 23545 программистов и 1664 робота. Сейчас ищут 847 программистов ...

group by

Тема в разделе "MySQL", создана пользователем DarkElf, 26 окт 2009.

  1. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    таблица примерно такой структуры:

    fid last_post author

    1 10 1
    1 11 2
    1 12 5
    2 9 2

    select
    max(last_post),
    author

    group by fid

    выдает

    12 1

    что-то меня клинит, но должно выдавать 12 5...
    если не клинит, то как получить автора именно последнего сообщения, а не время последнего и автора первого.

    заранее спасибо.
     
  2. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Что нужно?
    Получить max(last_post) и его автора для каждого fid?
    [sql]select fid, last_post, author
    from newTab
    where last_post in
    (select max(last_post) from newTab group by fid)[/sql]

    Ну а если нужно только последнее сообщение и его автор, то убираем group by:
    [sql]select last_post, author
    from newTab
    where last_post in
    (select max(last_post) from newTab)[/sql]
     
  3. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    м, а про подзапрос я не подумал. имхо, как-то проще тема должна решаться..

    P.S. спасибо за работоспособный вариант
     
  4. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Не проще и в нормальных СУБД тот вариант, что вы изначально попробовали вообще генерирует ошибку ;)
     
  5. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    MiksIr

    ну, забыл from table добавить, имхо, направление исходного запроса от этого не стало менее очевидным)

    а на тему нормальности / ненормальности той или иной субд - не будем начинать холивар.
     
  6. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Дело не в from, а в author.
    Поле author не участвует в агрегирующей функции и не указано в group by. Таким образом совершенно не понятно какого автора надо сопоставить какой группе.
     
  7. Pascal4eg

    Pascal4eg Активный пользователь

    С нами с:
    14 окт 2009
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Рыбинск
    [sql]SELECT last_post, author FROM tab order by last_post desc limit 1[/sql]
    один запрос все лучше чем два
     
  8. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Volt(220)

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

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

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

    Pascal4eg

    все бы хорошо, если бы там третьего поля не было - fid. А если их миллион уникальных будет - миллион запросов слать к базе?:)
     
  9. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    непонятно что есть fid
     
  10. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    DarkElf
    В корне неверно. Вы выбираете не одно из полей с помощью агрегирующей функции, а результат по группе.
    Это для Вас, меня, соседа логично, а для СУБД не логично. Она думает немного по-другому.
     
  11. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    armadillo

    это движок форума.
    трехуровневой иерархии
    форум / топик(и) / сообщение(я).
    у каждого топика есть характеристика в виде автора и timestamp'а последнего сообщения.

    задача: для каждого форума определить время и автора самого последнего сообщения.

    Volt(220)
    я и написал - кмк (как мне кажется)