SQL получает все строки, отсортированные без дубликатов - PullRequest
2 голосов
/ 26 апреля 2011

У меня есть таблица, которая выглядит примерно так:

________________________
|id|value|date|approved|
-----------------------

Что мне нужно сделать, так это получить каждую строку, где утверждено = 1. Эта часть очевидна. Для каждого вхождения значения требуется только самая последняя строка (отсортированная по дате).

Это означает, что с такой таблицей:

________________________
|id|value|date|approved|
-----------------------
|1 |Foo  | 5  |   1    |
|2 |Bar  | 6  |   1    |
|3 |Foo  | 8  |   1    |
-----------------------

Мне нужны только строки с идентификаторами 2 и 3.

Я предполагаю, что мне нужно как-то использовать DISTINCT, но я не уверен, как. Может ли кто-нибудь помочь мне здесь?

Ответы [ 6 ]

4 голосов
/ 26 апреля 2011
SELECT  m.*
FROM    (
        SELECT  DISTINCT value
        FROM    mytable
        ) md
JOIN    mytable m
ON      m.id =
        (
        SELECT  id
        FROM    mytable mi
        WHERE   mi.value = md.value
                AND mi.approved = 1
        ORDER BY
                mi.value DESC, mi.date DESC, mi.id DESC
        LIMIT 1
        )

Создайте индекс для (value, date, id), чтобы это работало быстро.

1 голос
/ 26 апреля 2011

Вам нужно:

select id, value, date, approved where (value, date) in (
   select value, max(date)
     from your_table
    group by value
);
0 голосов
/ 26 апреля 2011
select 
      id,
      value,
      date
   from 
      ( select
              value, max( date ) as LastInstance
           from
              YourTable
           where
              approved = 1
           group by
              value ) PreQuery
      join YourTable 
         on PreQuery.value = YourTable.value
         and PreQuery.LastInstance = YourTable.LastInstance
         and YourTable.approved = 1
   order by 
      date
0 голосов
/ 26 апреля 2011
select  id, value, date, approved 
from mytable a
where approved = 1
 and date =
      (select max(b.date)
       from mytable b
       where b.approved = 1
       and b.value = a.value)
0 голосов
/ 26 апреля 2011

На самом деле использование GROUP BY даст лучшие результаты. попробуйте что-то вроде этого:

ВЫБРАТЬ id, value, date, approved ИЗ таблицы, ГДЕ утверждено = 1 ГРУППА ПО value ЗАКАЗАТЬ НА date;

0 голосов
/ 26 апреля 2011

Попробуйте с этим:

SELECT * DISTINCT FROM TABLA WHERE APPROVED = 1 ORDER BY DATE DESC

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...