Выборка записей отсортированных с учётом бонусов

Тема в разделе "Базы данных", создана пользователем Dark Wizard, 15 фев 2020.

Метки:
Модераторы: latteo
  1. Dark Wizard

    Dark Wizard

    Регистр.:
    23 сен 2007
    Сообщения:
    184
    Симпатии:
    78
    Есть таблица clan_help_parts с полями id, date, login, bonus, penalty.

    Задача: вывести записи таблицей, упорядоченных по дате, при этом сдвигать записи с учётом бонусов-пенальти.

    Если без сортировки по дате, то работает так:

    Код:
     $sql = "SELECT *, (id + penalty - bonus) as position FROM clan_help_parts ORDER BY position";
    Т.е. нужно, чтобы они сначала сортировались по дате, а потом к ним применялись сдвиги.

    Можно ли это сделать в один запрос? Или вариант только выводить в php в многомерный массив, там назначать позиции-сдвиги, потом сортировать и выводить.
     
  2. Албибеков

    Албибеков Создатель

    Регистр.:
    24 июн 2016
    Сообщения:
    17
    Симпатии:
    8
    Может так?
    PHP:
    GROUP BY date
     
  3. Dark Wizard

    Dark Wizard

    Регистр.:
    23 сен 2007
    Сообщения:
    184
    Симпатии:
    78
    Группировать вообще ничего не нужно. Нужно вычислить номер позиции по дате, т.е. отсортировать по дате и пронумеровать. Потом обернуть во внешний запрос и там вычислить новые позиции. Вопрос - возможно ли это сделать в один запрос (может комбинированный) на SQL.
     
  4. Dark Wizard

    Dark Wizard

    Регистр.:
    23 сен 2007
    Сообщения:
    184
    Симпатии:
    78
    На stackoverflow подсказали такое решение:

    Код:
    $sql = "SELECT *, num - bonus + penalty
      FROM (
        SELECT *, @num := @num + 1 num
          FROM clan_help_parts, (SELECT @num := 0) x
         ORDER BY date
      ) y
      ORDER BY num - bonus + penalty";
    Так работает.