为了账号安全,请及时绑定邮箱和手机立即绑定

(LeetCode626:换座位)

标签:
Java

小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。
其中纵列的 id 是连续递增的
小美想改变相邻俩学生的座位。
你能不能帮她写一个 SQL query 来输出小美想要的结果呢?

示例

+---------+---------+|    id   | student |
+---------+---------+
|    1    | Abbot   ||    2    | Doris   |
|    3    | Emerson ||    4    | Green   |
|    5    | Jeames  |+---------+---------+

假如数据输入的是上表,则输出结果如下:

+---------+---------+|    id   | student |
+---------+---------+
|    1    | Doris   ||    2    | Abbot   |
|    3    | Green   ||    4    | Emerson |
|    5    | Jeames  |+---------+---------+

注意:

如果学生人数是奇数,则不需要改变最后一个同学的座位。
Solution:
根据题目,调整学生作为,可以分为三种情况:

  1. 座位号为奇数,   最后一个学生,        id 不变

  2. 座位号为奇数,   不是最后一个学生, id+1

  3. 座位号为偶数,                                     id-1

方法一

select * from (
SELECT id,student from seat where mod(id,2)=1 and id= (select count(id) from seat)
UNION 
SELECT id+1,student from seat where mod(id,2)=1 and id!=(select count(id) from seat)
UNION 
SELECT id-1,student from seat where mod(id,2)=0) d ORDER BY id;

a. 分析出三种情况
b. union 拼接处不同情况 select 结果集
c. 最后对结果集进行排序,order by id  (默认降序)

方法二

SELECT (case 
        when mod(id,2)=1 and id=(select COUNT(id) from seat) then id
        when mod(id,2)=1 and id!=(SELECT count(id) from seat) then id+1
        else id-1 end) 
as id,student from seat ORDER BY id;

方法二使用 case when 函数 区分出这三种情况

caee when 函数
mysql 的case when 函数有两种语法:

  1. 简单函数
    CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END

2.搜索函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END



作者:lconcise
链接:https://www.jianshu.com/p/4fd3939dc4d8


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
233
获赞与收藏
1008

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消