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>