MySQL выбирает и группирует строки, если одна за другой - PullRequest
3 голосов
/ 04 февраля 2010

Я разрабатываю приложение аукциона, в котором заявки хранятся в таблице в следующем формате:

id | user_id | auction_id | placed_at

Я бы хотел сгруппировать заявки по идентификатору пользователя и выбрать их количество, но только если идентификаторы пользователя отображаются один за другим Ставки упорядочены по убыванию place_at. Вот что я имею в виду:

1 | 1 | 1 | 01-04-2010 00:00:06
2 | 1 | 1 | 01-04-2010 00:00:05
3 | 2 | 1 | 01-04-2010 00:00:04
4 | 2 | 1 | 01-04-2010 00:00:03
5 | 3 | 1 | 01-04-2010 00:00:02
6 | 2 | 1 | 01-04-2010 00:00:01

В этом случае я должен получить:

count | user_id | auction_id
  2   |    1    |     1
  2   |    2    |     1
  1   |    3    |     1
  1   |    2    |     1

Как мне достичь этого результата? Результаты будут использоваться для генерации потока активности аукциона, поэтому они будут использоваться для генерации строки, такой как «ставка Джона Смита на этом аукционе 2 раза». Приложение построено с Ruby on Rails, если это поможет.

Заранее спасибо.

1 Ответ

1 голос
/ 04 февраля 2010
SELECT  user_id, auction_id, COUNT(*)
FROM    (
        SELECT  @r := @r + CASE WHEN @user_id = user_id AND @auction_id = auction_id THEN 0 ELSE 1 END AS _g,
                user_id, auction_id,
                @user_id := user_id,
                @auction_id := auction_id
        FROM    (
                SELECT  @r := 0,
                        @user_id := NULL,
                        @auction_id := NULL
                ) vars,
                mytable
        ORDER BY
                auction_id DESC, placed_at DESC
        ) q
GROUP BY
        user_id, auction_id, _g
ORDER BY
        _g
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...