2011-04-26 29 views
2

我有一個表,看起來是這樣的:SQL得到所有行排序未重複

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

我需要能夠做的就是在那裏批准= 1這一部分是顯而易見的每一行。對於每次出現的值,我只想要最近的一行(按日期排序)。

含義與像這樣的表:

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

我只想ID爲2和3

我想我需要使用DISTINCT不知何故行,但我不知道怎麼樣。任何人都可以幫我在這裏嗎?

回答

4
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)的索引快速地工作。

-2

試試這個:

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

希望這有助於你。

1

您需要:

select id, value, date, approved where (value, date) in (
    select value, max(date) 
    from your_table 
    group by value 
); 
+0

你最好用'JOIN'替換它:'IN'是不是很有效,與'GROUP BY'在'MySQL'。另外,如果'date'上有重複項呢? – Quassnoi 2011-04-26 13:00:00

+0

@Quassnoi:謝謝你的建議。不知道這不是MySQL的表現。如果在'日期'上有雙重勝​​利,那麼你就會得到兩個。這是我認爲OP想要的。 – 2011-04-26 13:01:48

0

實際使用GROUP BY將yeld更好的結果。嘗試是這樣的:

選擇idvaluedateapproved FROM表WHERE批准= 1 GROUP BY value ORDER BY date;

+0

你不能像這樣「分組」。您需要將您的結果集中的所有列「分組」並不具有聚合函數。 – 2011-04-26 12:59:01

+0

@Pablo:實際上你可以(在'MySQL'中),但結果將以任意順序(甚至不保證屬於單個記錄)。 – Quassnoi 2011-04-26 13:00:56

+0

@Quassnoi:你可以在MySQL中做到這一點?哇...奇怪。這是第一個可以讓你做到這一點的RDBMS(我知道的)。 – 2011-04-26 13:03:18

0
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
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