MySQL取出表中排序数据且不重复 删除重复数据(1/2)

今日做一个功能需求,从表中排序取出前十个且数据不一致的数据,如下列a表中的值有以下数据:

 代码如下 复制代码

mysql> select * from a;

+----+----------+

| id | user |

+----+----------+

| 1 | zhangsan |

| 2 | lisi |

| 3 | wangwu |

| 4 | zhangsan |

| 5 | zhaosi |

| 6 | wangwu |

| 7 | lisi |

| 8 | lisi |

| 9 | zhaosi |

+----+----------+

9 rows in set (0.00 sec)

我们需要取出id最大的前四位,且user不能一致的信息,按照以上信息以及需求,我们要搜索出结果为

zhaosi

lisi

wangwu

zhangsan 

不能按照普通的做法,如:

 代码如下 复制代码

mysql> select * from a order by id desc limit 4;

+----+--------+

| id | user |

+----+--------+

| 9 | zhaosi |

| 8 | lisi |

| 7 | lisi |

| 6 | wangwu |

+----+--------+

4 rows in set (0.00 sec)

这样搜索出来的有重复值,得使用distinct关键字

 代码如下 复制代码

mysql> select distinct user from a order by id desc limit 4; 

+----------+

| user |

+----------+

| zhaosi |

| wangwu |

| lisi |

| zhangsan |

+----------+

4 rows in set (0.00 sec)

其实应该是lisi与wangwu互换一下才是比较理想的,因为lisi最大的ID是8,而wangwu最大的ID是6,可能是lisi有一个ID为2导致的,我们把ID为2的删除,在来试试

 代码如下 复制代码

mysql> delete from a where id=2;

Query OK, 1 row affected (0.02 sec)

 

mysql> select * from a;

+----+----------+

| id | user |

+----+----------+

| 1 | zhangsan |

| 3 | wangwu |

| 4 | zhangsan |

| 5 | zhaosi |

| 6 | wangwu |

| 7 | lisi |

| 8 | lisi |

| 9 | zhaosi |

+----+----------+

8 rows in set (0.00 sec)

 

mysql> select distinct user from a order by id desc limit 4; 

+----------+

| user |

+----------+

| lisi |

| zhaosi |

| wangwu |

| zhangsan |

+----------+

4 rows in set (0.00 sec)

结果正是由于前边有较低的ID记录影响了排序。

虽然这条语句能搜索正确的效果,但可能排序不是那么理想,也就是ID最大的前四位能搜索出来,但在这四位数据里并不是按照ID大小排序的。

例1测试数据

 代码如下 复制代码

/* 表结构 */
DROP TABLE IF EXISTS `t1`;
CREATE TABLE IF NOT EXISTS `t1`(
  `id` INT(1) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20) NOT NULL,
  `add` VARCHAR(20) NOT NULL,
  PRIMARY KEY(`id`)
)Engine=InnoDB;

/* 插入测试数据 */
INSERT INTO `t1`(`name`,`add`) VALUES
('abc',"123"),
('abc',"123"),
('abc',"321"),
('abc',"123"),
('xzy',"123"),
('xzy',"456"),
('xzy',"456"),
('xzy',"456"),
('xzy',"789"),
('xzy',"987"),
('xzy',"789"),
('ijk',"147"),
('ijk',"147"),
('ijk',"852"),
('opq',"852"),
('opq',"963"),
('opq',"741"),
('tpk',"741"),
('tpk',"963"),
('tpk',"963"),
('wer',"546"),
('wer',"546"),
('once',"546");

SELECT * FROM `t1`;
+----+------+-----+
| id | name | add |
+----+------+-----+
|  1 | abc  | 123 |
|  2 | abc  | 123 |
|  3 | abc  | 321 |
|  4 | abc  | 123 |
|  5 | xzy  | 123 |
|  6 | xzy  | 456 |
|  7 | xzy  | 456 |
|  8 | xzy  | 456 |
|  9 | xzy  | 789 |
| 10 | xzy  | 987 |
| 11 | xzy  | 789 |
| 12 | ijk  | 147 |
| 13 | ijk  | 147 |
| 14 | ijk  | 852 |
| 15 | opq  | 852 |
| 16 | opq  | 963 |
| 17 | opq  | 741 |
| 18 | tpk  | 741 |
| 19 | tpk  | 963 |
| 20 | tpk  | 963 |
| 21 | wer  | 546 |
| 22 | wer  | 546 |
| 23 | once | 546 |
+----+------+-----+
 rows in set (0.00 sec)

 

查找id最小的重复数据(只查找id字段)

 代码如下 复制代码

/* 查找id最小的重复数据(只查找id字段) */
SELECT DISTINCT MIN(`id`) AS `id`
FROM `t1`
GROUP BY `name`,`add`
HAVING COUNT(1) > 1;
+------+
| id   |
+------+
|    1 |
|   12 |
|   19 |
|   21 |
|    6 |
|    9 |
+------+
 rows in set (0.00 sec)

查找所有重复数据

 代码如下 复制代码

/* 查找所有重复数据 */
SELECT `t1`.*
FROM `t1`,(
  SELECT `name`,`add`
  FROM `t1`
  GROUP BY `name`,`add`
  HAVING COUNT(1) > 1
) AS `t2`
WHERE `t1`.`name` = `t2`.`name`
  AND `t1`.`add` = `t2`.`add`;
+----+------+-----+
| id | name | add |
+----+------+-----+
|  1 | abc  | 123 |
|  2 | abc  | 123 |
|  4 | abc  | 123 |
|  6 | xzy  | 456 |
|  7 | xzy  | 456 |
|  8 | xzy  | 456 |
|  9 | xzy  | 789 |
| 11 | xzy  | 789 |
| 12 | ijk  | 147 |
| 13 | ijk  | 147 |
| 19 | tpk  | 963 |
| 20 | tpk  | 963 |
| 21 | wer  | 546 |
| 22 | wer  | 546 |
+----+------+-----+
 rows in set (0.00 sec)

 

查找除id最小的数据外的重复数据

 代码如下 复制代码

/* 查找除id最小的数据外的重复数据 */
SELECT `t1`.*
FROM `t1`,(
  SELECT DISTINCT MIN(`id`) AS `id`,`name`,`add`
  FROM `t1`
  GROUP BY `name`,`add`
  HAVING COUNT(1) > 1
) AS `t2`
WHERE `t1`.`name` = `t2`.`name`
  AND `t1`.`add` = `t2`.`add`
  AND `t1`.`id` <> `t2`.`id`;
+----+------+-----+
| id | name | add |
+----+------+-----+
|  2 | abc  | 123 |
|  4 | abc  | 123 |
|  7 | xzy  | 456 |
|  8 | xzy  | 456 |
| 11 | xzy  | 789 |
| 13 | ijk  | 147 |
| 20 | tpk  | 963 |
| 22 | wer  | 546 |
+----+------+-----+
 rows in set (0.00 sec)

 

首页 1 2 末页

时间: 2024-10-03 15:11:21

MySQL取出表中排序数据且不重复 删除重复数据(1/2)的相关文章

将mysql数据库表中的部分数据导入到oracle数据库中

问题描述 将mysql数据库表中的部分数据导入到oracle数据库中 有一个问题:需要将Mysql数据库表中的某些数据导入oracle数据库的表中,需要通过传递文件来实现.比如将mysql数据生成.sql文件,然后执行该文件就可以写入到oracle数据库中.希望各位高手给个思路,谢谢 解决方案 可以用sql命令把数据导出到文件,e然后再把文件导入数据库 解决方案二: 你自己思路不是已经很清晰了吗? or你的意思是需要定时自动导入? 自动导入的话 估计需要借助写个程序实现了 解决方案三: 你自己思

select-ibatis查出mysql数据库表中某字段为null的数据???怎么写动态sql

问题描述 ibatis查出mysql数据库表中某字段为null的数据???怎么写动态sql 例如 select * from test where name is null 这条sql 中 IS NULL 报错,不知道ibatis里该怎么写??? 解决方案 我竟然不知道你想表达什么 解决方案二: 这条sql报错,不知道怎么改进??? 解决方案三: select * from table where content is "" 解决方案四: 在数据库中null 也是个值 解决方案五: 我

mysql数据库表中插入一行新纪录时,调用一个java程序

问题描述 mysql数据库表中插入一行新纪录时,想要通知调用一个java程序,在网上查了下,说可以使用触发器,监听数据表中的变化,但是触发器器能直接调用外部的java程序吗,如果可以,该怎么做.或者说除了触发器以外,有好的其他方法,有想过去轮训数据库,但经常访问数据库效率太差了,所以想看看有没有其他的实现方法 解决方案 解决方案二:oracle的应该可以,你参考一下这两个链接:mysql的即使能实现,估计也很难:解决方案三:引用1楼u012724379的回复: oracle的应该可以,你参考一下

mysql查看表中每列信息

问题描述 mysql查看表中每列信息 mysql中如何查看表中每列的属性,比如是varchar(),还是int的? 解决方案 desc 表名......... 解决方案二: desc 表名........ 解决方案三: mysql查看表结构命令,如下: desc 表名; show columns from 表名; describe 表名; show create table 表名 如果回答对您有帮助,请采纳 解决方案四: 打开.......... 解决方案五: desc 表名; show col

mysql 同一个表中 如何 用一列的值 update 另一列

问题描述 mysql 同一个表中 如何 用一列的值 update  另一列.比如表 t1:id, user_name, nickname 如何用nickname 列来更新 user_name 列 多谢~~ 解决方案 update user set user_name = nickname;把所有的用户名更新为绰号

sql-oracle表中记录大于100条时删除插入时间最早的记录

问题描述 oracle表中记录大于100条时删除插入时间最早的记录 假设数据表中有字段id.name.sex.age.className.createtime.现在希望表 中保留100条记录,当第101条记录插入时,删除createtime最早的一条记录. 代码中如何写sql效率比较高,求大神指点! 解决方案 要效率高,就不要每次插入都删除.而是直接用top 100取,对时间字段设置为排序+索引字段.

从MySQL数据库表中取出随机数据的代码_php技巧

MySQL 如何从表中取出随机数据  以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩. 他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询. 翻了手册,找到了下面这个语句,可以完成任务了 SELECT * FROM table_name ORDER BY rand() LIMIT 5; rand在手册里是这么说的: RAND()  RAND(N)  返回在范围0到1.0内的随机浮点值.如果一个整数参数N被指定,它被用作种子值.  mysql> select RAND

MySQL 从表中取出随机数据

实现随机,从手册中找到了下面这个语句,可以完成任务: SELECT * FROM table_name ORDER BY rand() LIMIT 5; rand在手册里是这么说的:: RAND() RAND(N) 返回在范围0到1.0内的随机浮点值.如果一个整数参数N被指定,它被用作种子值. mysql> select RAND(); -> 0.5925 mysql> select RAND(20); -> 0.1811 mysql> select RAND(20); -&

如何从 MySQL 数据库表中检索数据

1.从数据库表中检索信息 实际上,前面我们已经用到了SELECT语句,它用来从数据库表中检索信息. select语句格式一般为: SELECT 检索关键词 FROM 被检索的表 WHERE 检索条件(可选) 以前所使用的" * "表示选择所有的列. 下面继续使用我们在上篇文章中创建的表mytable. 2.查询所有数据: mysql> select * from mytable; +----------+------+------------+----------+ | name