На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> Запрос в Mysql, не могу сообразить по order by/group by
    Имеется таблица вида
    id_Xfoobar
    11z
    12x
    13f
    21d
    22g
    23u
    24w
    312k
    313m

    Необходимо выбрать строки в которых поле foo максимальное с группировкой по полю id_X, должно получиться нечто такое
    id_Xfoobar
    13f
    24w
    313m

    Пробовал так
    ExpandedWrap disabled
      SELECT * FROM table GROUP BY id_X ORDER BY foo DESC

    Но как я понял сначала идёт группировка, а потом уже сортировка, а как сделать наоборот, сначала сортировку а потом группировку?
    Сообщение отредактировано: Gonarh -
      Привет!

      Такой результат можно получить следующим запросом:

      ExpandedWrap disabled
        SELECT t1.id_X, t1.foo, t1.bar
        FROM Table1 t1
        INNER JOIN (
          SELECT id_X, MAX(foo) AS max_foo
          FROM Table1
          GROUP BY id_X
        ) t2 ON t1.id_X = t2.id_X AND t1.foo = t2.max_foo
        ORDER BY t1.id_X;

      Вот тут можно это проверить онлайн.
        Наша радость от Вашего посещения, не знает границ :rolleyes:
          Gonarh
          Если версия MySQL - 8+, то
          ExpandedWrap disabled
            WITH
            cte AS (
                SELECT id_X, foo, bar,
                       ROW_NUMBER() OVER (PARTITION BY id_X ORDER BY foo DESC) rn
                FROM sourcetable
                )
            SELECT id_X, foo, bar
            FROM cte
            WHERE rn = 1;

          Если на (id_X, foo) в структуре НЕ наложено требование уникальности, то формально в таблице может оказаться несколько записей с одинаковым максимальным foo. Запрос Majestio в этом случае вернёт все эти записи. Мой - одну из них, причём случайную. Если нужна одна, но определённая, следует расширить выражение ORDER BY в определении окна и обеспечить уникальность с нужной сортировкой, чтобы возвращалась детерминированная запись.
            Цитата Akina @
            Если на (id_X, foo) в структуре НЕ наложено требование уникальности

            Индекса уникального нет, но по сути оно будет уникальным.
            Сообщение отредактировано: Gonarh -
              Gonarh
              Индекса нет - значит, все заверения не более чем фикция, и дубликат когда-нибудь обязательно встретится. Как итог сбоя, ошибки или злонамеренного действия. И крайне глупо запихивать голову в песок и не учитывать такой ситуации.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0239 ]   [ 15 queries used ]   [ Generated: 27.04.24, 11:38 GMT ]