mysql - SQL 交换行值

标签 mysql sql

这是来自 leetcode 的交换席位问题.

老师想给相邻的学生换座位。 输入:

+---------+---------+
|    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
    (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;

我的解决方案:

select 
(Case 
    when mod(id,2) !=0 and id != count(*) then id + 1
    when mod(id,2) !=0 and id = count(*) then id
    else id - 1
 end) as 'id',
 student
from seat
order by id;

给定的解决方案效果很好,但我的只能得到一行输出。

我的输出:

+---------+---------+
|    id   | student |
+---------+---------+
|    2    | Abbot   |
+---------+---------+

谁能解释一下我的解决方案和给定的解决方案之间有什么区别以及为什么我的解决方案是错误的? 谢谢。

最佳答案

当直接在查询中使用 count() 时,您将始终只有一行。 另一种解决方案是通过子查询使用 count() 作为整个查询的值。

尝试

SELECT id, count(*) FROM seat

SELECT id, (SELECT COUNT(*) FROM seat) FROM seat

并观察差异。

关于mysql - SQL 交换行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50615540/

相关文章:

php - 使用大量数据创建查询的最佳方法是什么?

输出表上的 MySQL 子查询

sql - 在限定时间内获得 COUNT() 结果

mysql - 如何从 Visual Basic 6 连接到 MySQL 数据库

MYSQL:从命令行检查正在使用的数据文件

Mysql选择序号

sql - 如何将rails数据库的内容写入外部文件

sql - 数据库扩展的最佳实践是什么?

mysql - 每天都有新事件计数

MySQL每日得分随全局排名变化