MySql 换座位

    科技2024-01-19  100

    换座位sql

    题目: 小美是一所中学的信息科技老师,她有一张 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 | ±--------±--------+ 注意: 如果学生人数是奇数,则不需要改变最后一个同学的座位。

    解题: 解法一:

    select rank() over(order by id) as id,student from ( select (id%2-0.5)*2 + id as id, student from seat ) a

    解法二:

    select if( id%2=0, id-1, if( id=(select max(id) from seat), id, id+1 ) ) as id,student from seat order by id

    解题思路: 解法一: 相邻的两位同学相互换座位,id为奇数与+1的id为偶数的同学换座位(奇数位id+1,偶数位id-1),id%2取余,奇数位余数为1再减0.5后乘以2等于1,而偶数位余数为0再减0.5后乘以2等于-1,因此奇数位是1+id,偶数位是-1+id;利用子查询select (id%2-0.5)*2 + id as id,student from seat查询出换位置后的数据,再用rank() over() id排序得出结果(不管学生总数是否为奇数,顺序排序后结果都一样)。

    解法二: 利用if语句查询,if(e1,e2,e3),当e1成立,返回e2,反之返回e3。

    if( id%2=0, id-1, if( id=(select max(id) from seat), id, id+1 ) ) as id

    if如果id%2取余为0(偶数)id-1,否则取余为1(奇数),奇数再做判断是否为最后一位学生,是返回id,反之返回id+1。

    题目来源: https://leetcode-cn.com/problems/exchange-seats/

    Processed: 0.019, SQL: 8