Mysql 选择具有N行的唯一记录限制

Mysql 选择具有N行的唯一记录限制,mysql,Mysql,我的数据库记录如下所示 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 |

我的数据库记录如下所示

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


提前谢谢

在mysql中,这是通过两个关键字完成的: 第一个是使用的
DISTINCT
从表中选择DICTINCT列
这样,只会从数据库返回完整的唯一行

第二个关键字用于限制返回的记录数,称为
LIMIT
并且用于这样:
从y限制编号中选择x

在您的情况下,它将类似于
选择DISTINCT*FROM table LIMIT 10

更多信息:

您可能希望按特定列对结果进行排序,以便从表中获得例如10个日期


旁注:distinct可以处理特定列和整行,在他的示例中,它只处理整行,请使用mysql手册了解更多信息。

您是否尝试选择第一个distinct“值”? 如果是的话,你能做什么

SELECT id, dataId, distinct(value), date
FROM table
ORDER BY date
下面是一个有趣的参考,您可以从组中选择一些项目。它可以从中找到

要获取每个数据ID的最新3个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;
这是两个示例的一个示例。

如果存在my_表,则删除表;
  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>
创建表格my_表格 (id INT非空自动增量主键 ,dataId INT不为空 ,值VARCHAR(12)不为空 ); 在my_表中插入值 (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'); 选择x.* 从我的表x 加入我的桌子 在y.dataid=x.dataid上 和y.id>=x.id 团体 按数据ID 身份证件 有计数(*)
这篇文章可以帮助你:[[1]:尝试使用不同的和最上面的N子句。@Jonny我不会在这里发布任何技术问题,甚至不会尝试在这种情况下你的N是什么?编辑我想它应该是3,不是吗?@prix我也有点困惑-在你的结果中,dataid 1是按日期降序排列的,dataid 2根本不是按顺序排列的。你能再检查一下你的预期结果吗?我是试图选择distinct“dataId”根据日期获取N条记录,其中N是每个唯一“dataId”的记录数限制,这是不正确的SQL语法。
distinct
不是一个函数。distinct语法只选择不同的记录。@prix我试图理解您所说的N,null是什么意思?如果是,哪一列包含null f您正在搜索的ield。@amazingacademy N是每个唯一数据标识的行数限制。因此,如果N=3,我的预期结果将是3条数据标识为1的最新记录和3条数据标识为2的最新记录,但DISTINCT仍然不是一个函数。这些括号对您没有任何帮助
  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>