За последние 24 часа нас посетили 17779 программистов и 1686 роботов. Сейчас ищут 912 программистов ...

Результат SELECT ... GROUP BY

Тема в разделе "MySQL", создана пользователем Yudik, 29 ноя 2012.

  1. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    Допустим есть таблица, в которой есть поле Name с неуникальными значениями.
    Собственно вопрос такой, обязательно ли запрос
    Код (Text):
    1. SELECT Table.*
    2. FROM Table
    3. GROUP BY Table.Name
    будет возвращать первые записи из групп , сформированных по Name, т.е. при использовании GROUP BY возвращается ОБЯЗАТЕЛЬНО первая строка группы или теоретически может вернуться другая ?
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    это определяется сортировкой по умолчанию. она будет по первичному ключу раз вы не задали другого в условии
     
  3. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    Если Вы имеете ввиду использование ORDER BY , то как раз на набор строк попавших в результат это влиять не будет. GROUP BY формирует группы на первых этапах формрования набора...
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    косяк в том, что MySQL допускает вольности в списке полей при группировке. другие диалекты SQL четко ограничивают этот набор как:
    - поля, которые перечислены во фразе GROUP BY,
    - другие поля могут упоминаться только как аргументы агрегатных функций (sum, count, ...)

    непонятно что должен выдать "*" при группировке. поэтому просто не используйте такую фигню. придерживайтесь стандартов и все будет четко.

    поясню: такой запрос понятен
    SELECT category, count(*), sum(amount) FROM items GROUP BY category
    для каждой категории выведем ее название, количество элементов в ней и просуммируем поле amount внутри каждой категории

    такой запрос непонятен ни программисту, ни походу серверу БД
    SELECT category, id, amount FROM items GROUP BY category
    какой id выведется? их же в каждой категории несколько. может первый? а amount из той же записи или тоже "первый" по какому то ключу, тогда по какому именно?
    ПОЛНАЯ ХУЙНЯ. просто не морочьте себе голову — это не тру сиквел.
     
  5. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    id и amount будут из одной записи, как раз вопрос "из какой" ? - для примера, допустим есть несколько записей в таблице(Category - par1 - par2):
    cat1 - 2 - 5 ;
    cat2 - 3 - 6 ;
    cat3 - 3 - 8 ;
    cat2 - 4 - 3 ;
    (допустим такой порядок следования записей, выдаст SELECT без сортировки)
    тогда запрос
    Код (Text):
    1. SELECT *
    2. FROM Table
    3. GROUP BY Category
    вернет следующий набор строк:
    cat1 - 2 - 5 ;
    cat2 - 3 - 6 ; - первая строка из сформированной группы (cat2 - 3 - 6 ; cat2 - 4 - 3 ;)
    cat3 - 3 - 8 ;
    если бы порядок следования
    cat1 - 2 - 5 ;
    cat2 - 4 - 3 ;
    cat3 - 3 - 8 ;
    cat2 - 3 - 6 ;
    то запрос с GROUP BY вернул бы
    cat1 - 2 - 5 ;
    cat2 - 4 - 3 ; - первая строка из сформированной группы (cat2 - 4 - 3 ; cat2 - 3 - 6 ;)
    cat3 - 3 - 8 ;
    Вот у меня вопрос и связан с этим - Возврат первой строки из группы (и формрование группы в порядке следования записей в таблице) это стандартизованное поведение или "так сложилось"?
    Просто ответ на этот вопрос, может помочь упростить некоторые типы запросов.
     
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ну ты прям Копитан Очевидность. это и ежику понятно.

    я про то что в текущем твоем запросе нет указания на сортировку , вот и получишь хрен знает что.
    для начала определись ЧТО ИМЕННО надо выбрать из таблицы, какие поля и в каком порядке. и уже исходя из этого строй запрос.

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

    забудь свой запрос. и напиши нам - ЧТО ТЫ ХОЧЕШЬ вытащить из таблицы конкретно. тогда поможем тебе
     
  7. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    Ну я ее здесь не указываю, потомучто это не имеет смысла, любой запроса вида:
    Код (Text):
    1. SELECT *
    2. FROM Table
    3. ORDER BY par1 , par2  [ или ORDER BY par2 , par1 , или ORDER BY par1 ,или  ORDER BY par2]
    4. GROUP BY Category
    вернет один и тот же набор строк, в одной и той же последовательности (или мне кажется что ты имел ввиду под "указания на сортировку" использование ORDER BY ??)
    Я знаю какие данные нужно вытащить и по какому критерию, и соответствующий запрос тоже могу составить. Но зная ответ на поставленный вопрос запросы можно упростить
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Эх, видимо каждый должен сам наступить на все грабли и заработать нужные рефлексы. Удачи!