求助一条SQL的写法,内有详细说明

sjrh 2014-01-24 07:57:05
有如下两个表
第一个表
UID name
1 张三
2 李四
3 王五

第二个表
ID 学历 取得日期 UID
1 本科 2012-07 1
2 大专 2010-07 2
3 本科 2013-07 2
4 硕士 2013-07 3
5 本科 2009-09 3


想用一条sql获得下面的结果
UID name 学历 取得时间
1 张三 本科 2012-07
2 李四 本科 2013-07
3 王五 硕士 2013-07

也就是用多表连接查询的方式取得某个用户的最高学历(最后获得的学历)。想了很久,搜了很久也无法实现,特来求救。
...全文
306 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbos1994 2014-02-14
  • 打赏
  • 举报
回复
引用 8 楼 u013630179 的回复:
还有请问,group by后面跟很多列是什么意思,一直绕不过来这个弯子,是说根据这么多列一起分组么??
bbos1994 2014-02-14
  • 打赏
  • 举报
回复
引用 8 楼 u013630179 的回复:
大侠请问,from后面还能跟两个表名? 小白飘过
果儿妈 2014-02-14
  • 打赏
  • 举报
回复
表结构: CREATE TABLE `t1` ( `uid` int(11) DEFAULT NULL, `name` varchar(30) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `t2` ( `id` INT(11) DEFAULT NULL, `学历` VARCHAR(30) DEFAULT NULL, `取得时间` CHAR(7) DEFAULT NULL, `uid` INT(11) DEFAULT NULL ) ENGINE=MYISAM DEFAULT CHARSET=utf8; 表数据: insert into `t1`(`uid`,`name`) values (1,'张三'),(2,'李四'),(3,'王五'); insert into `t2`(`id`,`学历`,`取得时间`,`uid`) values (1,'本科','2012-07',1),(2,'大专','2010-07',2),(3,'本科','2013-07',2),(4,'硕士','2013-07',3),(5,'本科','2009-09',3); 查询SQL: SELECT * FROM (SELECT t1.uid AS uid, t1.name AS NAME, t2.学历 AS 学历, t2.取得时间 AS 取得时间 FROM t1, t2 WHERE t1.uid = t2.uid) t3 WHERE NOT EXISTS(SELECT 1 FROM t2 WHERE t3.取得时间 < t2.取得时间 AND t3.uid = t2.uid); ---------------------注: 如果你想尽快的得到你要的结果,请贴出你的表结构和表数据---------------
风情哥 2014-02-13
  • 打赏
  • 举报
回复
风情哥 2014-02-13
  • 打赏
  • 举报
回复
日期取最大值得不到,你自己试一下就知道了
仁小晖 2014-02-07
  • 打赏
  • 举报
回复
日期取最大值,然后关联表不就好了。学历总不会越晚越低吧。。
wwwwb 2014-01-26
  • 打赏
  • 举报
回复
SELECT * FROM A INNER JOIN B B1 ON A.UID=B1.UID WHERE NOT EXISTS(SELECT 1 FROM B WHERE B1.UID=UID AND B1.取得日期 <取得日期)
ermuzi 2014-01-26
  • 打赏
  • 举报
回复
一种方法,先用子查询得到每个人的最终学历时间,然后求得最终学历 SELECT a.UID, b.`Name`, c.学历, c.取得时间 FROM ( -- 获得每个人的最终学历取得时间 SELECT UID, MAX(取得时间) 取得时间 FROM Cred b GROUP BY UID) a, Stu b, Cred c WHERE a.UID=b.UID AND b.UID=c.UID AND a.取得时间=c.取得时间 二种方法,与4楼相同,排除每个人取得时间较早的记录: SELECT a.UID, a.`Name`, 学历, 取得时间 FROM Stu a INNER JOIN Credb b ON a.UID=b.UID WHERE NOT EXISTS(SELECT 1 FROM Cred c WHERE c.UID=b.UID AND b.取得时间 <c.取得时间)
sjrh 2014-01-25
  • 打赏
  • 举报
回复
引用 2 楼 lzd_83 的回复:
最好做标示列便于统计。如1代表硕士2代表本科3代表专科。 select a.uid,a.name,b.学历,max(b.取得日期) from tb1,tb2 where a.uid=b.uid group by a.uid,a.name,b.学历 order by a.uid
我用max(取得日期),好像没有用。不知道max是不是只对数字有用。 我试下改成时间戳的方式保存日期看看。
Rotel-刘志东 2014-01-24
  • 打赏
  • 举报
回复
最好做标示列便于统计。如1代表硕士2代表本科3代表专科。 select a.uid,a.name,b.学历,max(b.取得日期) from tb1,tb2 where a.uid=b.uid group by a.uid,a.name,b.学历 order by a.uid
知道就是你 2014-01-24
  • 打赏
  • 举报
回复
这个简单,关键是要 学历表的ID,自动增长(第一条到第N条,学历依次增高),可以使用,max函数来判断.................

56,677

社区成员

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

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