Top.Mail.Ru
Ответы

Помогите написать SQL-запрос

Дана таблица Students, где указана информация о том, где сидит каждый студент:
+----------+----------+
| seat | name |
+----------+----------+
Было принято решение поменять студентов, которые сидят рядом, местами. Напишите SELECT-запрос, который из исходной таблицы сформирует расположение студентов после пересадки.

Примечание. 1 меняется местом со 2, 3 с 4 и так далее. Если студентов нечетное количество, то последний студент не пересаживается, а остается на своем месте.

Столбцы в результате
seat - номер места студента (автоинкрементное поле, пропусков нет)
name - имя студента.

Помогите пожалуйста решить задачу

По дате
По рейтингу
Аватар пользователя
Мудрец
4мес

Помочь или сделать за тебя?

Аватар пользователя
Профи
4мес

Какая версия базы данных?

Аватар пользователя
Высший разум
4мес
123456
 SELECT
  IFNULL(s2.seat, s1.seat) AS seat,
  s1.name
FROM Students AS s1
LEFT JOIN Students AS s2
  ON s2.seat = s1.seat - 1 + 2 * MOD(s1.seat, 2) 

В тексте задачи не сказано, что результат запроса должен быть отсортирован.
Во многих диалектах SQL вместо MOD(s1.seat, 2) можно написать s1.seat % 2

P.S. Вот такого вот:

автоинкрементное поле, пропусков нет

в реальной жизни нет и быть не может. Если поле автоинкрементное, в нём неизбежно будут пропуски.

Аватар пользователя
Оракул
4мес
1234567891011
 SELECT s.seat, 
       CASE 
         WHEN MOD(s.seat, 2) = 1 THEN COALESCE(s2.name, s.name) 
         ELSE s2.name 
       END AS name 
FROM Students s 
LEFT JOIN Students s2 
  ON ( (MOD(s.seat, 2) = 1 AND s2.seat = s.seat + 1) 
    OR (MOD(s.seat, 2) = 0 AND s2.seat = s.seat - 1) ) 
ORDER BY s.seat;