Как стать автором
Поиск
Написать публикацию
Обновить

«Ручная» сортировка в SQL запросе

Сразу оговорюсь, в статье описана не слишком распространенная ситуация, но, я думаю что, описываемый прием знают далеко не все опытные PHP, MySQL разработчики.

Речь пойдет о получении выборки из таблицы MySQL, отсортированной по какому-либо критерию (не обязательно по возрастанию или убыванию), информация о котором отсутствует в базе данных.

Рассмотрим ситуацию. Нам нужно получить из базы данных информацию об экзаменах, которые состоятся определенного числа, о студентах, которые будут эти экзамены сдавать, и показать ее на домашней странице ВУЗа. Как-то так:

Экзамен по дисциплине «Оптика»

Иванов А. И.
Синицин В. А.
Васильев Ю. Г.

Допустим, есть таблица 'exams', в которой есть поле 'examinees'. В этом поле хранится сериализованный (функцией serialize) в строку массив, в котором содержатся id, соответствующие студенту из таблицы 'students'. Логично, если эти id будут расположены в массиве в порядке выступления студентов. Вот так:

+--------------------------------+--------------+-------------------------------+
| title | date | examinees |
+--------------------------------+--------------+-------------------------------+
| Экзамен по дисциплине "Оптика" | 2009-07-01 | a:3:{i:0;i:5;i:1;i:8;i:2;i:2;}|
+--------------------------------+--------------+-------------------------------+


В таблище 'students' может содержаться любая информация о студенте.

+----+----------+-----+----------+
| id | last_name | first_name | patronymic |
+----+----------+-----+----------+
| 2 | Васильев | Ю. | Г. |
+----+----------+-----+----------+
| 5 | Иванов | А. | И. |
+----+----------+-----+----------+
| 8 | Синицин | В. | А. |
+----+----------+-----+----------+


Нам необходимо получить информацию о каждом экзамене и отобразить список студентов в том порядке, в котором они будут его сдавать.

Запрос для получения записи из таблицы с экзаменами я приводить не буду, он тривиален. В итоге у нас есть переменная, содержащая сериализованный массив из поля 'examinees'. Рассериализуем его:

$examininees_arr = unserialize($exams->examinees);
//Сейчас $examininees_arr = array(5, 8, 2);


* This source code was highlighted with Source Code Highlighter.
Получили массив. Напомню, что данные в нем находятся в порядке выступления студентов, и цель этой статьи — показать, как сохранить этот порядок. Запрос будет таким:

SELECT *
FROM STUDENTS
WHERE id IN (5, 8, 2)
ORDER BY id = 5 DESC, id = 8 DESC, id = 2 DESC


* This source code was highlighted with Source Code Highlighter.
Вот и все. В последней строке мы явно указали, в каком порядке должны выбираться строки. В результате нам не нужно писать никакого дополнительного кода на PHP для сортировки выбранных студентов в порядке выступления. А сформировать его можно так:

$result = mysql_query("SELECT *
FROM STUDENTS
WHERE id IN ("
.implode(", ", $examininees_arr).")
ORDER BY id = "
.implode(" DESC, id = ", $examininees_arr)." DESC");


* This source code was highlighted with Source Code Highlighter.
Может не очень красиво, а кому-то и вообще ужасно, но коротко и работает. С этим приемом можно экспериментировать, ставя определенные строки в начало или в конец выборки.

P. S. Если у кого есть на примете способ более простой, чем тот, что описан в этой статье, поделитесь, пожалуйста, на tweezers@ya.ru.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.