求一条去重的mysql语句

Squallxye 2010-06-04 02:39:34
数据如下:
num count
1 12
2 34
3 34
2 52
1 9
以num为参考,count取大的值sql语句执行后的结果:
num count
1 12
3 34
2 52

等待中...
...全文
504 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuoxingyu 2010-06-04
  • 打赏
  • 举报
回复
楼主的意思是想在T1里插入的时候,如果A字段有相同的,那么只保存A值相同的B值最大的那条记录,其他的在T1里面都删除。不知道我理解的对不对。

这个判断放在T1的INSERT之后操作,用触发器实现是最合理的,但是触发器不能UPDATE触发器附属的表自己,只能修改别的表。这里解决思路是创建一个和T1一样的表

create table t2 like t1;

然后在T1表加触发器,判断写进的值,然后去修改T2表,你实际需要的记录,都在T2里面。
mysql> delimiter |
mysql> CREATE TRIGGER MAX_INSERT BEFORE INSERT ON t2
-> FOR EACH ROW BEGIN
-> IF EXISTS(SELECT 1 FROM t3 WHERE b<=new.b) THEN
-> DELETE FROM t3 WHERE a=new.A AND b<=new.b;
-> INSERT INTO t3 VALUES (NEW.a,new.b);
-> END IF ;
-> END;
-> |
Query OK, 0 rows affected (0.16 sec)

mysql> delimiter ;
mysql> select * from t2;
+------+------+
| a | b |
+------+------+
| 1 | 12 |
| 2 | 20 |
| 2 | 34 |
| 3 | 10 |
| 100 | 40 |
| 3 | 40 |
| 3 | 40 |
| 100 | 50 |
| 1 | 50 |
| 2 | 50 |
| 2 | 80 |
+------+------+
11 rows in set (0.00 sec)

mysql> select * from t3;
+------+------+
| a | b |
+------+------+
| 2 | 80 |
+------+------+
1 row in set (0.00 sec)

mysql> insert into t2 values(3,100);
Query OK, 1 row affected (0.14 sec)

mysql> select * from t3;
+------+------+
| a | b |
+------+------+
| 2 | 80 |
| 3 | 100 |
+------+------+
2 rows in set (0.00 sec)

mysql> insert into t2 values(3,200);
Query OK, 1 row affected (0.23 sec)

mysql> select * from t3;
+------+------+
| a | b |
+------+------+
| 2 | 80 |
| 3 | 200 |
+------+------+
2 rows in set (0.00 sec)

mysql>
Squallxye 2010-06-04
  • 打赏
  • 举报
回复
有个地方遗漏了----》
需要向t2里面插入数据啊
[Quote=引用 9 楼 zuoxingyu 的回复:]

引用 7 楼 squallxye 的回复:

insert into t2 values(1,12),(2,20),(2,34),(3,10);-----------sql1
select a,max(b) from t2 group by a; -----------sql2
能不能将这2条语句合二为一?
执行后的结果:在t2中保留上面执行的sql2后的结果……
[/Quote]
Squallxye 2010-06-04
  • 打赏
  • 举报
回复
MYSQL:版本: 4.1.20
表:
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| a | int(11) | YES | | NULL | |
| b | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 create table t2(a int,b int);
2 插入数据:
insert into t2 values(1,12),(2,20),(2,34),(3,10);
3 查询结果:
+------+------+
| a | b |
+------+------+
| 1 | 12 |
| 2 | 20 |
| 2 | 34 |
| 3 | 10 |
+------+------+
4 我想要的结果:
select a,max(b) from t2 group by a;
+------+--------+
| a | max(b) |
+------+--------+
| 1 | 12 |
| 2 | 34 |
| 3 | 10 |
+------+--------+
不过这个结果是查询出来的,在t2这个表中什么都没有发生变化,于是用这个语句但是出现了错误:
delete from t2 where b not in (select max(b) from t2 group by a);
ERROR 1093 (HY000): You can't specify target table 't2' for update in FROM clause
想实现保留group by中最大的b的结果。


请问:
以上的步骤操作中,可否用一条sql语句,可以实现2(插入数据)后保留b为最大值的记录?
不要用这个语句,因为这里a不是主键:
insert into t2(a,b) on duplicate key update b=max(b);

zuoxingyu 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 squallxye 的回复:]

insert into t2 values(1,12),(2,20),(2,34),(3,10);-----------sql1
select a,max(b) from t2 group by a; -----------sql2
能不能将这2条语句合二为一?
执行后的结果:在t2中保留上面执行的sql2后的结果?
就是说:向t2中插入数据,然后将数值较小的都……
[/Quote]

你是想把表里小的记录都删除,是这样意思吧。
1:create table t1 like t2;
2: insert into t1 select a,max(b) as b from t2 group by a;
3: drop table t2;
4: rename table t1 to t2;

哈哈,当然也可以一条DELETE语句搞定。
ACMAIN_CHM 2010-06-04
  • 打赏
  • 举报
回复
(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

Squallxye 2010-06-04
  • 打赏
  • 举报
回复
insert into t2 values(1,12),(2,20),(2,34),(3,10);-----------sql1
select a,max(b) from t2 group by a; -----------sql2
能不能将这2条语句合二为一?
执行后的结果:在t2中保留上面执行的sql2后的结果?
就是说:向t2中插入数据,然后将数值较小的都删除,只保持某一记录t2.a中t2.b最大的记录。

zuoxingyu 2010-06-04
  • 打赏
  • 举报
回复
mysql> create table t2(a int,b int);
Query OK, 0 rows affected (0.59 sec)

mysql> insert into t2 values(1,12),(2,20),(2,34),(3,10);
Query OK, 4 rows affected (0.14 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> select a,max(b) from t2 group by a;
+------+--------+
| a | max(b) |
+------+--------+
| 1 | 12 |
| 2 | 34 |
| 3 | 10 |
+------+--------+
3 rows in set (0.00 sec)
wwwwb 2010-06-04
  • 打赏
  • 举报
回复
select a.* from tt a where not exists(select 1 from tt where a.num=num and a.count<count)
soaringsouth 2010-06-04
  • 打赏
  • 举报
回复
delete from table where count not in (select max(count) from table group by num)
WWWWA 2010-06-04
  • 打赏
  • 举报
回复
select a.num,a.count from tt a inner join tt b on a.num=b.num and a.count<=b.count
group by a.num,a.count having count(b.num)=1
ACMAIN_CHM 2010-06-04
  • 打赏
  • 举报
回复
参考下贴中的多种方法 (N=1)

http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
mysqi 2010-06-04
  • 打赏
  • 举报
回复

select num,max(count) from table group by num;

56,682

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧