2014-10-31 119 views
0

我有如下所示數據庫記錄N行,選擇唯一的記錄限制與

id | dataId | value 
1 | 1  | xxx 
2 | 1  | xx1 
3 | 1  | xx2 
4 | 1  | xx1 
5 | 2  | yyy 
6 | 2  | yy1 
7 | 2  | yy2 
8 | 1  | zzz 
9 | 2  | yy3 

我期望的結果會是這樣的

id | dataId | value 
8 | 1  | zzz 
4 | 1  | xx1 
3 | 1  | xx2 
9 | 2  | yy3 
7 | 2  | yy2 
6 | 2  | yy1 

我想每個數據ID選擇N最新的ID,其中N在這種情況下是3

在此先感謝。

+0

這篇文章可以幫助你: [http://stackoverflow.com/questions/10491474/mysql-select-distinct-multiple-columns-based-on-the-uniqueness-of-one -row] [1] [1]:http:// stackoverflow。com/questions/10491474/mysql-select-distinct-multiple-columns-based-one-unique-of-one-row – 2014-10-31 14:34:45

+0

嘗試使用DISTINCT和TOP N子句。 – ZuoLi 2014-10-31 14:35:24

+0

@Jonny我不會在這裏發佈任何技術問題,甚至沒有嘗試 – prix 2014-10-31 14:38:57

回答

0

這裏有一個有趣article你可以從一組獲得項目的選擇數量的參考。它可以從this question找到。

要獲取最新的3個IDS對每個數據ID,您可以使用此查詢:

SELECT id, dataid, value, date 
FROM myTable m 
WHERE(
    SELECT COUNT(*) FROM myTable mt 
    WHERE mt.dataid = m.dataid AND mt.id >= m.id 
) <= 3; 

總之,在子查詢的WHERE子句會爲最大的ID vlaues過濾器,你可以把它限制在小於或等於3.請注意,WHERE mt.dataid = m.dataid是用於分組行的內容。

正如文章所言,這不是最有效的方式,而是一種乾淨的書寫方式。一種可能更有效的方法是對每個查詢單獨使用一個UNION。有關更多信息,請參閱文章。它看起來像這樣:

(SELECT * FROM myTable WHERE dataid = 1 ORDER BY id DESC LIMIT 3) 
UNION ALL 
(SELECT * FROM myTable WHERE dataid = 2 ORDER BY id DESC LIMIT 3) 

這裏是兩個例子的SQL Fiddle

+1

非常感謝!在我身邊工作。 – prix 2014-10-31 16:02:28

0

在MySQL中,這是用拖的關鍵字進行: 首先是DISTINCT所使用如此:這樣,只有富有獨特的行從數據庫返回SELECT DICTINCT column FROM table

第二關鍵字用於限制返回記錄的數量和被稱爲LIMIT 和使用這樣:你的情況SELECT x FROM y LIMIT number

它會像SELECT DISTINCT * FROM table LIMIT 10

更多信息: http://dev.mysql.com/doc/refman/5.0/en/select.html

您可能想要按特定列排序結果,以便從表中獲取例如10個日期。

旁註:distinct可以在特定列和整行上工作,在他的示例中它只在整行上,使用mysql手冊瞭解更多信息。

0

您是否嘗試選擇第一個不同的'值'? 如果是的話,你可以做

SELECT id, dataId, distinct(value), date 
FROM table 
ORDER BY date 
+0

我試圖選擇不同的'dataId'獲取N個記錄的日期,其中N是每個唯一'dataId'的記錄限制 – prix 2014-10-31 14:44:34

+2

這是不正確的SQL語法。 'distinct'不是一個函數。 – 2014-10-31 14:45:17

+0

DISTINCT語法只選擇不同的記錄。 @prix我試圖理解你的意思是N,null?如果是的話,哪一列包含你正在搜索的空字段。 – amazingacademy 2014-10-31 15:39:06

1
DROP TABLE IF EXISTS my_table; 

    CREATE TABLE my_table 
    (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
    ,dataId INT NOT NULL  
    ,value VARCHAR(12) NOT NULL 
); 

    INSERT INTO my_table VALUES 
    (1 ,1  ,'xxx'), 
    (2 ,1  ,'xx1'), 
    (3 ,1  ,'xx2'), 
    (4 ,1  ,'xx1'), 
    (5 ,2  ,'yyy'), 
    (6 ,2  ,'yy1'), 
    (7 ,2  ,'yy2'), 
    (8 ,1  ,'zzz'), 
    (9 ,2  ,'yy3'); 

    SELECT x.* 
    FROM my_table x 
    JOIN my_table y 
     ON y.dataid = x.dataid 
    AND y.id >= x.id 
    GROUP 
     BY dataid 
     , id 
    HAVING COUNT(*) <= 3 
    ORDER 
     BY dataid 
     , id DESC; 
    +----+--------+-------+ 
    | id | dataId | value | 
    +----+--------+-------+ 
    | 8 |  1 | zzz | 
    | 4 |  1 | xx1 | 
    | 3 |  1 | xx2 | 
    | 9 |  2 | yy3 | 
    | 7 |  2 | yy2 | 
    | 6 |  2 | yy1 | 
    +----+--------+-------+ 
    6 rows in set (0.03 sec) 

    mysql>