Найдите строку с максимальным значением идентификатора в MySQL

StackOverflow https://stackoverflow.com/questions/1305473

  •  19-09-2019
  •  | 
  •  

Вопрос

Взгляните на таблицу 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 |
+----+-----------+---------+------------------------+--------------------------+

Я пытаюсь придумать запрос, чтобы вернуть статьи.

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

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

Любые предложения оценены ...

Это было полезно?

Решение

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

SELECT a.id, a.version
FROM articles a
WHERE a.version = (
    SELECT MAX(version)
    FROM articles b
    WHERE b.articleId = a.articleId
)

Другие советы

От 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.

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

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

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.

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

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

Выберите * из статей, где articleId в (выберите Max (articleversion) из статей)

Ты можешь сделать

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

Я не знаю, что MySQL будет работать с ним, но Oracle и SQL Server в порядке с этим.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top