2014-10-31 140 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>