SQL, проблема с OrderBy / GroupBy - PullRequest
2 голосов
/ 10 февраля 2011

В моей таблице есть два поля: article_id и version

Пример:

   article_id | version
   -----------|----------   
        5     |   1
        5     |   2
        6     |   1

Что я хочу сделать, это получить последнюю версию для каждого идентификатора статьи . (В моем примере я хочу получить объект статьи 5 версии 2 и статьи 6 и версии 1).

Проблема в том, что mysql делает group by вместо order by, поэтому возвращает мне ПЕРВУЮ версию каждой статьи, но я хочу обратного.

У вас есть идея, пожалуйста?

Решение

select *
from article r
where r.version=(
 select max(version) 
 from article r2 
 where r2.article_id = r.article_id
);

Ответы [ 5 ]

5 голосов
/ 10 февраля 2011

Ваш вопрос немного расплывчато , но я считаю, это более или менее то, что вы хотите:

select * from (
   select
      <table>.*,
      row_number() over (partition by article_id order by version desc) r  
   from 
      <table>
)
where r = 1

Запрос возвращает одну запись для каждого (отдельного) article_id.Это запись с наивысшей версией возвращенного article_id.

Итак, вместе с «тестовым примером» это можно увидеть в действии:

create table tq84_resorces (
  id           number primary key,
  article_id   number not null,
  version      number not null
);

insert into tq84_resorces values (50, 5, 1);
insert into tq84_resorces values (60, 5, 2);
insert into tq84_resorces values (70, 6, 1);


select * from (
   select
      tq84_resorces.*,
      row_number() over (partition by article_id order by version desc) r  
   from 
      tq84_resorces
)
where r = 1

, которое возвращает:

        ID ARTICLE_ID    VERSION          R
---------- ---------- ---------- ----------
        60          5          2          1
        70          6          1          1
2 голосов
/ 10 февраля 2011
select
    article_id,
    max(version) as Version

from article

group by article_id
2 голосов
/ 10 февраля 2011
select yt.id, yt.article_id, yt.version
    from (select article_id, max(version) as max_version
              from YourTable
              group by article_id) t
        inner join YourTable yt
            on t.article_id = yt.article_id
                and t.max_version = yt.version
1 голос
/ 10 февраля 2011

Будет ли это работать:

select articleId, (select top 1 version 
                  from article ar2 
                  where ar2.articleId = ar.articleId
                  order by version desc) as version
from article ar
group by ar.articlId

Работает в SQL Server 2005, не тестировал в MySQL.

1 голос
/ 10 февраля 2011

Сначала вы должны изменить столбец версии на целое число (возможно, с префиксным столбцом, если вам сильно нужна строка), чем вы можете

Select MAX(version) 
...
Group By article_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...