Таким образом что относительно C++. Сделайте я должен перейти к длинам:
template <int BITS> struct int_traits_t;
template <> struct int_traits_t <16> {typedef uint16_t int_t;};
template <> struct int_traits_t <32> {typedef uint32_t int_t;};
template <> struct int_traits_t <64> {typedef uint64_t int_t;};
typedef int_traits_t <sizeof (void*) * 8>::int_t myintptr_t;
только для получения портативного целого числа размера указателя?
Здесь вам понадобится дополнительный запрос:
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
уже сгруппирован). Это поможет вернуть его еще быстрее.
Как отмечено в комментариях, если вы хотите получить максимальную версию для каждого идентификатора статьи
, вы можете сделать следующее:
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
.
ВЫБРАТЬ Articles.id ИЗ статей, ГДЕ Articles.version IN (ВЫБРАТЬ МАКС. (Articles.version) из статей)
может быть что-то вроде:
выберите * из статей, где ID статьи (выберите макс. (Версия статьи) из статей)
Вы можете сделать
SELECT articles.id
FROM articles a
WHERE NOT EXISTS(SELECT * FROM articles a2 WHERE a2.version > a.version)
Я не знаю, что MySQL будет работать с этим, но Oracle и SQL-сервер с этим справятся.