626. Exchange Seats-(LeetCode之Database篇)
2024-09-01 00:09:53
问题表述
数据库表如下:
id | student |
---|---|
1 | Abbot |
2 | Doris |
3 | Emerson |
4 | Green |
5 | Jeames |
现在要通过SQL语句将表变换成如下:
id | student |
---|---|
1 | Doris |
2 | Abbot |
3 | Green |
4 | Emerson |
5 | Jeames |
即id不变,奇数位和偶数位交换位置,如果表的总行数为奇数,则最后一行不变。
问题解决
首先看到这个问题,我就想SQL里面是不是有什么置换函数之类的,结果去查了查,并没有这样的函数。在我尝试了各种select方法后,还是没能将这题解出来…最后还是去讨论区看了看大神们的解答,看完各种答案后瞬间豁然开朗。
这题的解题思路其实并不是想办法将student的列置换,而是通过操作id列来达到置换的效果。
比较通过的解法就是下面这种:
select
if(id < (select count(*) from seat), if(id mod 2=0, id-1, id+1), if(id mod 2=0, id-1, id)) as id, student
from seat
order by id asc
其中IF函数的用法:
格式:IF(Condition,A,B)
意义:当Condition为TRUE时,返回A;当Condition为FALSE时,返回B。
所以上面的SQL语句就是,先对id进行操作。先计算总行数,最后一行如果是奇数id不变,如果是偶数id减1,其余行id为奇数的让id加1,id为偶数的让id减1,最后再对id做升序操作,就可以得到结果了。
其中还有一种解法:
/* get all the even numbered rows as odd numbered rows */
SELECT s1.id - 1 as id, s1.student
FROM Seat s1
WHERE s1.id MOD 2 = 0
UNION
/* get all the odd numbered rows as even numbered rows */
SELECT s2.id + 1 as id, s2.student
FROM Seat s2
WHERE s2.id MOD 2 = 1 AND s2.id != (SELECT MAX(id) FROM Seat)
/* Just don't get the last row as we will handle it in the next UNION */
UNION
/* get the last row if odd and don't change the id value */
SELECT s3.id, s3.student
FROM Seat s3
WHERE s3.id MOD 2 = 1 AND s3.id = (SELECT MAX(id) FROM Seat)
/* Order the result by id */
ORDER BY id ASC;
思路都和第一种方法大同小异。
最新文章
- iOS引入JavaScriptCore引擎框架(一)
- 夺命雷公狗----Git---7---GitHub当仓库本地使用(完)
- 框架SpringMVC笔记系列 二 传值
- Laravel之Service Container服务容器
- 利用HTML5开发Android(1)---Android设备多分辨率的问题
- 持久化框架Hibernate 开发实例(二)
- overflow:hidden真的失效了吗
- struts2 json 定义全局Date格式
- C#中Split分隔字符串的应用(C#、split、分隔、字符串)
- Oracle进阶研究问题收集
- python基础教程(六)
- Docker最全教程——MongoDB容器化(十二)
- NetSarang软件中nssock2.dll模块被植入恶意代码技术分析与防护方案
- 浏览器h5新建文件 保存到本地(相当于浏览器写文件)
- sqlserver2008 传入的表格格式数据流(tds)协议流不正确。
- 洛谷P4169 天使玩偶 CDQ分治
- js 计算后样式封装
- jmeter插件使用说明
- 20165205 学习基础与C语言基础调查
- 对于devexpress gridview 内插图加加进度条等的一点解读
热门文章
- 关闭Wind XP/Vista/Win7的DEP数据执行保护汇总(转)
- OpenCV图像的基础叠加
- c语言bit倒置最好的算法-离msb-lsb至lsb-msb
- CentOS(一) 最小化安装
- Leetcode 94 Binary Tree Inorder Traversal 二叉树
- Leetcode 104 Maximum Depth of Binary Tree 二叉树
- WPF用Blend写的交通信号灯
- 【C#】获取";我的电脑";的名字,如This PC、这台计算机
- wpf 禁用window的systemmenu
- 图像滤镜艺术--PS平均(滤镜-模糊-平均)效果