Сортировка результатов SQL-запроса
Сортировка результатов SQL-запроса производится при помощи конструкции ORDER BY, после которой указывается имя столбца, который подвергается сортировке. Если после имени столбца указано ключевое слово ASC, сортировка производится по возрастанию, если же указано ключевое слово DESC, то сортировка будет по убыванию. Таким образом, задача сводится к динамическому формированию SQL-запроса, в конструкцию ORDER BY которого подставлялись бы имена выбранных столбцов и порядок сортировки. Для этого будем использовать запрос вида
$query = "SELECT * FROM products WHERE 1 ORDER BY ".$orderby." ".$sort;
где переменная $orderby будет содержать имя столбца, а $sort принимать значение ASC или DESC, в зависимости от того, какой вид сортировки выбран.
<?php
$dblocation = "localhost"; // Имя сервера
$dbuser = "root"; // Имя пользователя
$dbpswrd = ""; // Пароль
$dbname = "catalog"; // Имя базы данных
// Соединение с сервером базы данных
$dblink = mysql_connect( $dblocation, $dbuser, $dbpswrd );
mysql_query( 'SET NAMES cp1251' );
// Выбираем базу данных
mysql_select_db( $dbname, $dblink );
// По умолчанию сортировка по наименованию, по возрастанию
$orderby = 'title';
$sort = 'ASC';
if ( isset( $_GET['orderby'] ) and isset( $_GET['sort'] ) ) {
if ( in_array( $_GET['orderby'], array( 'code', 'title', 'price' ) ) ) $orderby = $_GET['orderby'];
if ( in_array( $_GET['sort'], array( 'ASC', 'DESC' ) ) ) $sort = $_GET['sort'];
}
$query = 'SELECT code, title, description, price
FROM products
ORDER BY '.$orderby.' '.$sort;
$res = mysql_query( $query );
echo '<h1>Каталог продукции</h1>'."\n";
// Выводим "шапку" таблицы
echo '<table border="1" cellpadding="4" cellspacing="0" style="border-collapse: collapse; empty-cells: show">'."\n";
echo '<tr>';
if ( $sort == 'ASC' ) {
$tmp = 'DESC';
$image = 'down.gif';
} else {
$tmp = 'ASC';
$image = 'up.gif';
}
if ( $orderby == 'code' )
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=code&sort='.$tmp.'">Код</a> <img src="'.$image.'" alt="" /></th>';
else
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=code&sort=ASC">Код</a></th>';
if ( $orderby == 'title' )
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=title&sort='.$tmp.'">Наименование</a> <img src="'.$image.'" alt="" /></th>';
else
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=title&sort=ASC">Наименование</a></th>';
echo '<th>Описание</th>';
if ( $orderby == 'price' )
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=price&sort='.$tmp.'">Цена</a> <img src="'.$image.'" alt="" /></th>';
else
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=price&sort=ASC">Цена</a></th>';
echo '</tr>'."\n";
while( $prd = mysql_fetch_array( $res ) ) {
echo '<tr>';
echo '<td>'.$prd['code'].'</td>'."\n";
echo '<td>'.$prd['title'].'</td>'."\n";
echo '<td>'.$prd['description'].'</td>'."\n";
echo '<td>'.$prd['price'].'</td>'."\n";
echo '</tr>'."\n";
}
echo '</table>'."\n";
?>
$dblocation = "localhost"; // Имя сервера
$dbuser = "root"; // Имя пользователя
$dbpswrd = ""; // Пароль
$dbname = "catalog"; // Имя базы данных
// Соединение с сервером базы данных
$dblink = mysql_connect( $dblocation, $dbuser, $dbpswrd );
mysql_query( 'SET NAMES cp1251' );
// Выбираем базу данных
mysql_select_db( $dbname, $dblink );
// По умолчанию сортировка по наименованию, по возрастанию
$orderby = 'title';
$sort = 'ASC';
if ( isset( $_GET['orderby'] ) and isset( $_GET['sort'] ) ) {
if ( in_array( $_GET['orderby'], array( 'code', 'title', 'price' ) ) ) $orderby = $_GET['orderby'];
if ( in_array( $_GET['sort'], array( 'ASC', 'DESC' ) ) ) $sort = $_GET['sort'];
}
$query = 'SELECT code, title, description, price
FROM products
ORDER BY '.$orderby.' '.$sort;
$res = mysql_query( $query );
echo '<h1>Каталог продукции</h1>'."\n";
// Выводим "шапку" таблицы
echo '<table border="1" cellpadding="4" cellspacing="0" style="border-collapse: collapse; empty-cells: show">'."\n";
echo '<tr>';
if ( $sort == 'ASC' ) {
$tmp = 'DESC';
$image = 'down.gif';
} else {
$tmp = 'ASC';
$image = 'up.gif';
}
if ( $orderby == 'code' )
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=code&sort='.$tmp.'">Код</a> <img src="'.$image.'" alt="" /></th>';
else
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=code&sort=ASC">Код</a></th>';
if ( $orderby == 'title' )
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=title&sort='.$tmp.'">Наименование</a> <img src="'.$image.'" alt="" /></th>';
else
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=title&sort=ASC">Наименование</a></th>';
echo '<th>Описание</th>';
if ( $orderby == 'price' )
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=price&sort='.$tmp.'">Цена</a> <img src="'.$image.'" alt="" /></th>';
else
echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=price&sort=ASC">Цена</a></th>';
echo '</tr>'."\n";
while( $prd = mysql_fetch_array( $res ) ) {
echo '<tr>';
echo '<td>'.$prd['code'].'</td>'."\n";
echo '<td>'.$prd['title'].'</td>'."\n";
echo '<td>'.$prd['description'].'</td>'."\n";
echo '<td>'.$prd['price'].'</td>'."\n";
echo '</tr>'."\n";
}
echo '</table>'."\n";
?>
Посмотреть рабочий пример можно здесь.
Fred Perry:
Спасибо за иформацию очень помогло
7 Апрель 2009, 23:23crystalbit:
in_array интересная конструкция) всегда раньше много фильтровал, а до такого простого не додумался)
15 Июнь 2009, 12:38Кострома:
почему поле marker_id всегда одно и тоже ?
17 Август 2009, 1:10admin:
Кострома, во-первых, не marker_id, а maker_id - уникальный ID производителя товара. А во-вторых, что значит “всегда одно и тоже”?
17 Август 2009, 8:12Samsung - 1001
Acer - 1002
Toshiba - 1003
BenQ - 1004
EPSON - 1005
Максим уфа:
Долго искал исходники, а на твоем блоге нашел, даже более чем искал!
Спасибо тебе огромное!
5 Апрель 2011, 17:26