Найдите строку с максимальным значением идентификатора в MySQL
-
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.