Команда ORDER BY
ORDER BY
позволяет сортировать записи по одной или нескольким колонкам.
Сортировка возможна в восходящем или нисходящем порядке с помощью ключевых слов ASC
и DESC
.
По умолчанию используется восходящий порядок сортировки (ASC
).
Синтаксис ORDER BY
mysql> SELECT column1, column2, ... , columnN
-> FROM table_name
-> ORDER BY column1, column2, ... , columnN ASC|DESC
Рассмотрим несколько примеров сортировки в таблице books из базы данных Bookstore.
Подключимся к базе данных.
1 |
USE Bookstore; |
Выведем записи таблицы books отсортированные по цене.
mysql> SELECT id, title, author, price
-> FROM books
-> ORDER BY price;
+----+---------------------------+--------------------+--------+
| id | title | author | price |
+----+---------------------------+--------------------+--------+
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 |
| 10 | Бесы | Фёдор Достоевский | 212.00 |
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 |
| 6 | Война и мир | Лев Толстой | 341.00 |
| 7 | Анна Каренина | Лев Толстой | 346.00 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 |
+----+---------------------------+--------------------+--------+
10 rows in set (0.00 sec)
Если нужно отсортировать в нисходящем порядке, то добавим ключевое слово DESC
.
mysql> SELECT id, title, author, price
-> FROM books
-> ORDER BY price DESC;
+----+---------------------------+--------------------+--------+
| id | title | author | price |
+----+---------------------------+--------------------+--------+
| 8 | Отцы и дети | Иван Тургенев | 371.00 |
| 7 | Анна Каренина | Лев Толстой | 346.00 |
| 6 | Война и мир | Лев Толстой | 341.00 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 |
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 |
| 10 | Бесы | Фёдор Достоевский | 212.00 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 |
+----+---------------------------+--------------------+--------+
10 rows in set (0.00 sec)
Важно заметить, что сортировка по второй колонке будет работать, только тогда когда в первой колонке есть повторяющиеся значения. Если в первой колонке все значения уникальны, то вторая колонка не будет отсортирована, иначе будет нарушена целостность таблицы.
Выведем записи отсортированные по двум колонкам author и price.
mysql> SELECT id, title, author, price
-> FROM books
-> ORDER BY author, price DESC;
+----+---------------------------+--------------------+--------+
| id | title | author | price |
+----+---------------------------+--------------------+--------+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 |
| 7 | Анна Каренина | Лев Толстой | 346.00 |
| 6 | Война и мир | Лев Толстой | 341.00 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 |
| 10 | Бесы | Фёдор Достоевский | 212.00 |
+----+---------------------------+--------------------+--------+
10 rows in set (0.00 sec)
Сортировка данных таблицы MySQL с помощью PHP (PDO)
Создадим файл index.php
, в котором отобразим форму с выбором вида сортировки, по типу тех, что делают в интернет-магазинах и выведем саму таблицу со значениями из базы данных.
Каждый раз когда пользователь будет менять вид сортировки, страница будет перезагружаться.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ORDER BY</title> <style> body{font-family: sans-serif;} label{display: inline-block;} td:nth-child(5),td:nth-child(6){text-align:center;} table{border-spacing: 0;border-collapse: collapse;} td, th{padding: 10px;border: 1px solid black;} th{background: #2189f7; color: white; } form{margin-bottom: 5px; display: block;} tr:nth-of-type(odd){background: #eeeeee;} </style> </head> <body> <!-- Форма выбора вида сортировки --> <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST"> <label for="sortValue">Сортировать по: </label> <select name="sort_value" id="sortValue"> <option value="id" selected>Номеру</option> <option value="price">Цене (сначала дешевле)</option> <option value="price DESC">Цене (сначала дороже)</option> <option value="title">Названию</option> <option value="author">Автору</option> </select> <input type="submit" value="Применить"> </form> <?php $db_server = "localhost"; $db_user = "root"; $db_password = "12"; $db_name = "Bookstore"; try { /// Открываем соединение, указываем адрес сервера, имя бд, имя пользователя и пароль, // также сообщаем серверу в какой кодировке должны вводится данные в таблицу бд. $db = new PDO("mysql:host=$db_server;dbname=$db_name", $db_user, $db_password,array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8")); // Устанавливаем атрибут сообщений об ошибках (выбрасывать исключения) $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Проверяем поле формы на пустое значение. if(empty($_POST['sort_value'])){ $book_sort_value = "id"; // Сортировка по умолчанию } else { $book_sort_value=$_POST['sort_value']; } // Запрос на вывод отсортированных записей из таблицы $sql = "SELECT id, title, author, price FROM books ORDER BY $book_sort_value"; // Подготовка запроса $statement = $db->prepare($sql); // Выполняем запрос $statement->execute(); // Получаем массив строк $result_array = $statement->fetchAll(); // Создаем таблицу вывода echo "<table><tr><th>ID</th><th>Title</th><th>Author</th><th>Price</th></tr>"; foreach ($result_array as $result_row) { echo "<tr>"; echo "<td>" . $result_row["id"] . "</td>"; echo "<td>" . $result_row["title"] . "</td>"; echo "<td>" . $result_row["author"] . "</td>"; echo "<td>" . $result_row["price"] . "</td>"; echo "</tr>"; } echo "</table>"; } catch(PDOException $e) { echo "Ошибка при выводе записей из базы данных: " . $e->getMessage(); } // Закрываем соединение с БД $db = null; ?> </body> </html> |
После вызова страницы index.php
получим полностью рабочую сортировку с помощью HTML-формы.
