Сортировка ключей в MySQL

Сортировка данных в MySQL в примерах

Мало ли кому понадобится…
Пример использования.

< ?
function timeMeasure() {
    list($msec, $sec) = explode(chr(32), microtime());
    return ($sec+$msec);
}
define("TIMESTART",timeMeasure());

/*	Определение настроек подключения к MySQL-серверу.	*/

define("DB_HOST", "sql_host");
define("DB_USER", "sql_user");
define("DB_PASS", "sql_pass");
define("DB_BASE", "sql_base");

$mysql = new sqlClass();
$mysql->open(DB_HOST, DB_USER, DB_PASS, DB_BASE);

$sort = new sort_keys();
$sort->mysql = &$mysql;
$tables = array('table' => 'id', 'table2' => 'id2');
$sort->update_keys($tables);

echo"


";
?>

< ?
///////////////////////////////////////////////////////////////
/*
*
*	Класс сортировки ключей в таблицах MySQL.
*	Автор файла:             niga (izra) izra.ru
*	Версия:                  1.0
*	Для работы необходим класс для работы с MySQL или прямые руки.
*	
*/
///////////////////////////////////////////////////////////////
class sort_keys {
	var $keys = array();
	var $new_keys = array();
	var $old_keys = array();
	var $mysql = false;
	
	//	Последний элемент массива
	#
	#	Примечание: необходимо всязи с глюком array_search(array_pop($array), $array);
	#
	function last_key($array) {
		return array_pop($array);
	}
	
	//	Проверка существования таблиц и ключей.
	function search_table($table, $id) {
		$tables_r = $this->mysql->query("SHOW TABLES FROM `".DB_BASE."`");
		while ($tables_row = $this->mysql->fetch_row($tables_r)) {
			if ($table == $tables_row[0]) {
				//	Таблица найдена.
				$status_r = $this->mysql->query("SHOW INDEX FROM `".$table."` FROM `".DB_BASE."`");
				while ($status_row = $this->mysql->fetch_row($status_r)) {
					if ($status_row[4] == $id) {
						//	Ключ найден.
						return true;
					}
				}
			}
		}
		return false;
	}
	
	//	Создание массива ключей.
	function make_new_keys() {
		for ($i=1;$i < array_search ($this->last_key($this->keys), $this->keys)+1;++$i) {
			if (!array_key_exists($i, $this->keys)) {
				//	Последний элемент массива.
				$last_key = array_search($this->last_key($this->keys), $this->keys);
				//	Массив новых ключей.
				$this->new_keys[$i] = $this->keys[$last_key];
				//	Массив старых ключей.
				$this->old_keys[$i] = array_search($this->keys[$last_key], $this->keys);
				unset($this->keys[$last_key]);
			}
		}
	}
	
	function update_keys($tables) {
		if (!$this->mysql) {
			echo "Необходимо соединение с MySQL сервером.";	
		}
		$error = false;
		if (!is_array($tables) or empty($tables)) {
			echo "Укажите таблицы и индексы.";
			return false;
		}
		$i=0;
		foreach ($tables as $table => $key) {
			if ($i == 0) {
				if ($this->search_table($table, $key)) {
					//	Таблица и ключ найден.
					$keys_r = $this->mysql->query("SELECT `".$key."` FROM `".$table."`");
					while ($keys_row = $this->mysql->fetch_row($keys_r)) {
						//	Создаем массив неотсортированных ключей.
						$this->keys[$keys_row[0]] = $keys_row[0];
					}
				} else {
					//	Ошибка.
					echo "Таблица ".$table." не существует, либо отсутствует индекс ".$key;
					unset($tables[$table]);
					$error = true;
				}
			}
		}
		//	Создание ключей.
		$this->make_new_keys();
		foreach ($this->new_keys as $key => $value)
			foreach ($tables as $table => $id)
				$this->mysql->query("UPDATE `".$table."` SET `".$id."` = ".$key." WHERE `".$id."` = ".$this->old_keys[$key]);
		if (!$error)
			echo "Операция успешно завершена.";

	}
}

class sqlClass {
	var $connection;
	var $count_query = 0;
	var $count_time = 0;
	
	
	function open($host,$user,$pass,$base,$port=3306) {
		$host = trim($host);
		$user = trim($user);
		$pass = trim($pass);
		$base = trim($base);
		$port = trim($port);
		$this->connection = false;
		if (empty($host) or empty($user) or empty($pass) or empty($base) or !eregi("^[0-9]+$", $port))
			exit("Данные для подключения не корректны.");
		if (!$this->connection = @mysql_pconnect($host.':'.$port,$user,$pass))
			exit("Невозможно подключиться к серверу баз данных.");
		if (!mysql_select_db($base, $this->connection)) 
			exit("Небозможно найти БД ".$base);
		if ($this->info() >= 4)
			$this->query("SET NAMES cp1251");
		return $this->connection;
	}
	
	function query($query) {
		if (!empty($query)) {
			$time_before = $this->get_time();
			if ($this->result = mysql_query($query, $this->connection)) {
				$return = $this->result;
			}
			$this->count_time += $this->get_time() - $time_before;
			$this->count_query++;
			return $return;
		}
	}
	
	function get_time() {
		list($seconds, $microSeconds) = explode(' ', microtime());
		return ((float)$seconds + (float)$microSeconds);
	}
	
	function info() {
		$info = mysql_get_server_info();
		$info = substr($info, 0, strpos($info, "-"));
		$info = split("\.", $info);
		return $info[0];
	}
	
	function fetch_row($result) {
		if (!is_resource($result))
			return false;
		$row = @mysql_fetch_row($result);
		return $row;
	}
}
?>