Смещение MySQL Max - PullRequest
       26

Смещение MySQL Max

2 голосов
/ 13 января 2011

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

SELECT period,max(id) AS maxid
FROM f
WHERE type = '1'
GROUP BY period

Это приводит к:

+--------+-------+
| period | maxid |
+--------+-------+
| 1      | 21878 |
| 2      | 21879 |
| 3      | 20188 |
| 4      | 21873 |
| 5      | 21872 |
| 6      | 21874 |
| 7      | 21875 |
| 8      | 21876 |
| 9      | 21877 |
+--------+-------+

Это ожидаемый результат.

Однако теперь я хочу выполнить запрос, которыйвозвращает максимальный идентификатор, но один для каждого периода.Я решил, что лучший способ сделать это - использовать параметр смещения в LIMIT.Чтобы проверить, что это будет работать, я запустил:

SELECT period,(SELECT id FROM freight_data ORDER BY id DESC LIMIT 1) AS maxid
FROM f
WHERE type = '1'
GROUP BY period

Это выдаст:

+--------+-------+
| period | maxid |
+--------+-------+
| 1      | 21903 |
| 2      | 21903 |
| 3      | 21903 |
| 4      | 21903 |
| 5      | 21903 |
| 6      | 21903 |
| 7      | 21903 |
| 8      | 21903 |
| 9      | 21903 |
+--------+-------+

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

Итак, мои вопросы:

  • Как работает MAX?и
  • Есть ли способ, которым я могу получить результат, аналогичный max (id), но смещенный на один результат?

Любая помощь будет принята с благодарностью!

Спасибо

Ответы [ 3 ]

2 голосов
/ 13 января 2011

Вы можете сделать это, что немного ужасно:

SELECT DISTINCT ff.period, (
    SELECT id 
    FROM f 
    WHERE period = ff.period 
    AND type = '1' 
    ORDER BY id DESC
    LIMIT 1, 1
) as max_id_but_1
FROM f as ff
WHERE type = '1';

EDIT:

Если каждый идентификатор принадлежит только одному периоду, я думаю, вы можете использовать это:

SELECT period, max(id)
FROM f
WHERE type = '1'
AND id NOT IN (
    SELECT max(id)
    FROM f
    WHERE type = '1'
    GROUP BY period
)
GROUP BY period;

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

1 голос
/ 13 января 2011
SELECT  period,
        (
        SELECT  id
        FROM    f fi
        WHERE   fi.type = '1'
                AND fi.period = f.period
        ORDER BY
                type DESC, period DESC, id DESC
        LIMIT 1, 1
        )
FROM    f
WHERE   type = '1'
GROUP BY
        period

Создайте индекс для f (type, period, id), чтобы это работало быстро.

1 голос
/ 13 января 2011

Если я правильно понимаю ваш вопрос, вам нужен второй по величине идентификатор для каждого периода, верно?

Это ужасно и не проверено, конечно:

SELECT period,max(id) AS maxid
FROM f
WHERE type = '1'
AND maxid NOT IN(
  SELECT period,max(id) AS maxid
  FROM f
  WHERE type = '1'
  GROUP BY period
)
GROUP BY period

Вы можете получить некоторые конфликты с идентификатором 'maxid'.

...