Найти строку с максимальным значением id в MySQL - PullRequest
5 голосов
/ 20 августа 2009

Взгляните на таблицу MySQL ниже под названием «Статьи»:

+----+-----------+---------+------------------------+--------------------------+
| id | articleId | version | title                  | content                  |
+----+-----------+---------+------------------------+--------------------------+
|  1 |         1 | 0.0     | ArticleNo.1 title v0.0 | ArticleNo.1 content v0.0 |
|  2 |         1 | 1.0     | ArticleNo.1 title v1.0 | ArticleNo.1 content v1.0 |
|  3 |         1 | 1.5     | ArticleNo.1 title v1.5 | ArticleNo.1 content v1.5 |
|  4 |         1 | 2.0     | ArticleNo.1 title v2.0 | ArticleNo.1 content v2.0 |
|  5 |         2 | 1.0     | ArticleNo.2 title v1.0 | ArticleNo.2 content v1.0 |
|  6 |         2 | 2.0     | ArticleNo.2 title v2.0 | ArticleNo.2 content v2.0 |
+----+-----------+---------+------------------------+--------------------------+

Я пытаюсь найти запрос для возврата Articles.id, где Articles.version - максимальное число.

Фактическая таблица статей содержит более 10000 записей.

Так что в этом примере я ТОЛЬКО хочу, чтобы возвращались Articles.id 4 и 6. Я смотрел на ключевое слово отлично и функцию max (), но, похоже, не могу его поймать.

Любые предложения приветствуются ...

Ответы [ 7 ]

5 голосов
/ 20 августа 2009

Из руководства MySQL это делает трюк:

SELECT a1.id
FROM Articles a1
LEFT JOIN Articles a2 ON a1.articleId = a2.articleId AND a1.version < a2.version
WHERE a2.articleId IS NULL;

Из связанного руководства:

LEFT JOIN работает на основе того, что когда s1.price a1.version находится на максимальном минимальном значении, нет s2.price a2.version с большим меньшим значением и, таким образом, соответствующим s2.article a2.articleId значение NULL.

(я отредактировал, чтобы их текст соответствовал вашей ситуации.)

4 голосов
/ 20 августа 2009

Вам нужен подзапрос здесь:

SELECT a.id, a.version
FROM articles a
WHERE a.version = (
    SELECT MAX(version)
    FROM articles b
    WHERE b.articleId = a.articleId
)
4 голосов
/ 20 августа 2009

Вы можете использовать подзапрос здесь:

select
    a.id
from
    articles a
where
    a.version = (select max(version) from articles)

Поскольку это не коррелированный подзапрос, он будет довольно быстрым (таким же быстрым или быстрым, как объединение), поэтому вам не нужно об этом беспокоиться. Но он вернет все значения, которые имеют максимум articleid.

Конечно, я бы порекомендовал создать индекс для articleid (при условии, что id уже кластеризован). Это поможет ему вернуться еще быстрее.

Как отмечено в комментариях, если вы хотите получить максимальную версию для каждого articleid, вы можете сделать следующее:

select
    a.id
from
    articles a
    inner join (select articleid, max(version) 
                from articles group by articleid) as b on
        a.articleid = b.articleid
        and a.version = b.version

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

1 голос
/ 30 декабря 2011

Все приведенные выше ответы могут решить заявленную проблему DJDonaL3000. Но большинство из них являются коррелированными подзапросами, которые снижают производительность приложения. Если вы используете облачное приложение, я предлагаю не использовать вышеуказанные запросы. В таком случае лучше всего поддерживать две таблицы: A и B. A, содержащую всегда самую последнюю версию статьи, и B, содержащую сведения обо всех версиях. Проблема в том, что будет больше обновлений и вставок в таблицы, но выборка будет быстрее, так как вам просто нужно выполнить обычный запрос на выборку в таблице A. Выполнение группировки по и max во внутреннем запросе будет стоить вам

1 голос
/ 20 августа 2009

Вы можете сделать

SELECT articles.id
  FROM articles a
 WHERE NOT EXISTS(SELECT * FROM articles a2 WHERE a2.version > a.version)

Я не знаю, MySQL будет работать с ним, но Oracle и SQL-сервер хорошо с этим.

1 голос
/ 20 августа 2009

может быть что-то вроде:

выберите * из статей, в которых articleid (выберите max (articleversion) из статей)

1 голос
/ 20 августа 2009

SELECT Articles.id FROM Articles WHERE Articles.version IN (SELECT MAX(Articles.version) FROM Articles)

...