2022年10月更文挑战30-6-leetcode刷题626-换座位

131 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

leetcode刷题626-换座位

前文

本文内容为leetcode数据库类型的刷题,题目主要考察数据库操作中对于数据的查询操作。查询中需要对结果进行二次处理,变更实际的查询结果。本题目的题目序号为626,题目链接为leetcode.cn/problems/ex…

题目内容

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+

Id是该表的主键列。 该表的每一行都表示学生的姓名和ID。 Id是一个连续的增量。 编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。

按 id 升序 返回结果表。

题目分析

根据题目的要求,我们需要通过已知的学生表获取每个学生id以及名字,但我们获取的id不能是原始的id,需要进行奇偶的调换。但还有一点特殊的是,如果总人数是奇数,还需要保持最后一个id数值不变。由于这个额外的条件限制,我们不能直接的对查询出来的id进行处理,需要采用case语句进行数据的条件分析。如果是奇数,且不是最后一个元素,那么就将其调整为对应的偶数。如果是奇数且为最后一个元素,则保持原id不变。如果是偶数则调整为对应的奇数。利用case语句,完成我们在sql中的数据拆分。根据这种方式,我们就可以按照所需要的结果,处理我们查出来的数据,符合题目的要求。至此,该题目解答完毕。

解题答案及结果

SELECT
    (CASE
        WHEN MOD(id, 2) != 0 AND counts != id THEN id + 1
        WHEN MOD(id, 2) != 0 AND counts = id THEN id
        ELSE id - 1
    END) AS id,
    student
FROM
    seat,
    (SELECT
        COUNT(*) AS counts
    FROM
        seat) AS seat_counts
ORDER BY id ASC;

image.png

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。