求一sql写法

zd_cat 2011-03-09 04:35:51
现在表A里有字段id,name,loginTime
select * from A后结果如下
1 小明 2011-3-7
2 小明 2011-3-8
3 小明 2011-3-9
4 小黄 2011-3-8
5 小黄 2011-3-9

但我想要的结果是
3 小明 2011-3-9
5 小黄 2011-3-9

请问该语句该怎么写?
...全文
59 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
thegodofwar 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zuoxingyu 的回复:]
SQL code
select id,name,max(loginTime)
from a group by id,name;
[/Quote]
这个不对,#2、#5正解..............
WWWWA 2011-03-09
  • 打赏
  • 举报
回复
mysql> SHOW CREATE TABLE QA\G;
*************************** 1. row ***************************
Table: QA
Create Table: CREATE TABLE `qa` (
`id` bigint(20) NOT NULL DEFAULT '0',
`name` varchar(2) NOT NULL DEFAULT '',
`loginTime` varchar(8) NOT NULL DEFAULT '',
`act` varchar(1) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> SELECT * FROM QA;
+----+--------+-----------+-----+
| id | name | loginTime | act |
+----+--------+-----------+-----+
| 1 | 灏忔槑 | 2011-3-7 | A |
| 2 | 灏忔槑 | 2011-3-8 | C |
| 3 | 灏忔槑 | 2011-3-9 | A |
| 4 | 灏忛粍 | 2011-3-8 | A |
| 5 | 灏忛粍 | 2011-3-9 | C |
+----+--------+-----------+-----+
5 rows in set (0.00 sec)
mysql> SET NAMES GBK;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM qa a WHERE NOT EXISTS(SELECT 1 FROM qa WHERE a.NAME=NAME AN
D a.loginTime<loginTime);
+----+------+-----------+-----+
| id | name | loginTime | act |
+----+------+-----------+-----+
| 3 | 小明 | 2011-3-9 | A |
| 5 | 小黄 | 2011-3-9 | C |
+----+------+-----------+-----+
2 rows in set (0.02 sec)
mysqldbd 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wwwwa 的回复:]
2、5、6代码均可
2、6代码取loginTime最大
5代码取ID最大

测试一下吧
[/Quote]



drop table if exists dms.A;
create table dms.A
select 1 id, '小明' name, '2011-3-7' loginTime, 'A' act union all
select 2 ,'小明','2011-3-8','C' union all
select 3 ,'小明','2011-3-9','A' union all
select 4,'小黄','2011-3-8','A' union all
select 5,'小黄','2011-3-9','C';

select a2.*
from(
select a.name, max(a.loginTime) md from dms.A a group by a.name
)a1, dms.A a2
where a1.name=a2.name
and a1.md=a2.loginTime;

-- 结果如下:
'3', '小明', '2011-3-9', 'A'
'5', '小黄', '2011-3-9', 'C'
mysqldbd 2011-03-09
  • 打赏
  • 举报
回复
drop table if exists dms.A;
create table dms.A
select 1 id, '小明' name, '2011-3-7' d, 'A' f union all
select 2 ,'小明','2011-3-8','C' union all
select 3 ,'小明','2011-3-9','A' union all
select 4,'小黄','2011-3-8','A' union all
select 5,'小黄','2011-3-9','C';

select a2.*
from(
select a.name, max(a.d) md from dms.A a group by a.name
)a1, dms.A a2
where a1.name=a2.name
and a1.md=a2.d;

-- 结果如下:
'3', '小明', '2011-3-9', 'A'
'5', '小黄', '2011-3-9', 'C'
WWWWA 2011-03-09
  • 打赏
  • 举报
回复
2、5、6代码均可
2、6代码取loginTime最大
5代码取ID最大

测试一下吧
zd_cat 2011-03-09
  • 打赏
  • 举报
回复
不好意思漏了字段了
现在表A里有字段id,name,loginTime,act
select * from A后结果如下
1 小明 2011-3-7 A
2 小明 2011-3-8 C
3 小明 2011-3-9 A
4 小黄 2011-3-8 A
5 小黄 2011-3-9 C

但我想要的结果是
3 小明 2011-3-9 A
5 小黄 2011-3-9 C

请问该语句该怎么写?ACT代表一个动作这里用AC字母表示
WWWWA 2011-03-09
  • 打赏
  • 举报
回复
or
select a.* from tt a inner join
(select name,max(loginTime) as ma from tt group by name) b
on a.name=b.name and a.loginTime=b.ma
WWWWA 2011-03-09
  • 打赏
  • 举报
回复
假设以ID为标准:
select * from tt a where not exists(select 1 from tt where a.name=name and a.id<id)
ACMAIN_CHM 2011-03-09
  • 打赏
  • 举报
回复
以楼主提供的测试数据,最简单的方法如下
select * from A where loginTime='2011-3-9'
ACMAIN_CHM 2011-03-09
  • 打赏
  • 举报
回复
参考下贴中的多种方法

http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
WWWWA 2011-03-09
  • 打赏
  • 举报
回复
select * from tt a where not exists(select 1 from tt where a.name=name and a.loginTime<loginTime)
zuoxingyu 2011-03-09
  • 打赏
  • 举报
回复
select id,name,max(loginTime)
from a group by id,name;

56,675

社区成员

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

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