Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ручная сортировка
 
 автор: Зелим   (05.08.2007 в 19:40)   письмо автору
 
 

Здравствуйте! Вот столкнулся я с такой странной задачей:
ORDER BY не помогает, потому что мне не нужно сортировать по убыванию или возрастанию.
К примеру:

$MyBase = mysql_query("SELECT id from USERS where id = '15' or id = '13' or id  = '21' or id = '19");
while($id = mysql_fetch_array($MyBase)) {
print "$id[id]<br/>";      //И так далее }

Мне нужно отсортировать, как я это указал при запросе 15, 13, 21, 19... Но используя ORDER BY это невозможно. Как мне выводить именно в том порядке, в котором я хочу?

   
 
 автор: Unkind   (05.08.2007 в 19:52)   письмо автору
 
   для: Зелим   (05.08.2007 в 19:40)
 

Зачем Вы делаете запрос вообще? "Дайте мне идентификатор того, где идентификатор равен пяти".
И, следовательно, если Вы знаете что за чем следует, то никакой сортировки делать не надо вообще.

   
 
 автор: Зелим   (05.08.2007 в 20:40)   письмо автору
 
   для: Unkind   (05.08.2007 в 19:52)
 

Допусти я не знаю значения полей, которых я хочу получить.
К примеру, есть массив и он тоже создается автоматически. Вот так:

$dir = opendir("./folder/");
while($file = readdir($dir)) {
$fname = explode(".",$file);
if($fname[1] == "jpg" && time()-filemtime("./folder/$file")<86400) $array[filemtime("./folder/$file")] = $fname[0]; }
closedir($dir);
krsort($array);
for(Reset($array); $key = key($array); Next($array)) { $id = "or id = $array[$key] "; }
$users = mysql_query("select id from users where id = 'n' ".$id." ");
while($user = mysql_fetch_array($users)) {
print "$user[id]<br/>"; }

Код неуклюжий, но все равно. Я смотрю какие фотки в нем новые, беру их названия, потому что они сопадают с идентификаторами в базе. Но дело в том что при запросе в базу данных я получаю результат, отсортированный по времени добавления записи в базу. А я хочу, что бы было отсортировано по дате изменения файла (фото).

   
 
 автор: Unkind   (05.08.2007 в 20:53)   письмо автору
 
   для: Зелим   (05.08.2007 в 20:40)
 

Это можно реализовать, например, с помощью UNION:

SELECT * FROM `tbl` WHERE `id` = 10
UNION
SELECT * FROM `tbl` WHERE `id` = 8
UNION
SELECT * FROM `tbl` WHERE `id` = 9;


А вообще Вам было бы крайне желательно добавить в структуру таблицы поле, в кот-ром хранится время последнего изменения фото. Так будет намного лучше.

А Ваш код в дальнейшем приведет к тому, что скрипт будет выполняться непозволительно долго.

   
 
 автор: Зелим   (05.08.2007 в 20:57)   письмо автору
 
   для: Unkind   (05.08.2007 в 20:53)
 

Спасибо! Тогда все-таки придется мне дополнительно покопаться в базе.
P.S. А пробежка по файлам занимает много времени?

   
 
 автор: Unkind   (05.08.2007 в 21:08)   письмо автору
 
   для: Зелим   (05.08.2007 в 20:57)
 

В зависимости от кол-ва файлов, конечно. Но Вы еще и используете filemtime(), да еще и два раза.
Данные о последней модификации файла кешируются, но в таком случае возможны ошибки в выводе нужных фото. Придется очищать кеш и заново узнавать время последней модификации. Это, безусловно, еще больше ухудшит положение.

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

Вместо Вашего кода можно будет сделать простейший запрос вроде
SELECT * FROM `users` ORDER BY `mphoto` DESC LIMIT 5;

   
 
 автор: Зелим   (05.08.2007 в 21:12)   письмо автору
 
   для: Unkind   (05.08.2007 в 21:08)
 

Просто у меня и так в этой таблице, в которой хранится информация о юзерах, много полей :)
Ну-с, остается добавить еще одно, которое отвечает за обновление.
Спасибо!

   
 
 автор: Unkind   (05.08.2007 в 21:13)   письмо автору
 
   для: Зелим   (05.08.2007 в 21:12)
 

Ничего страшного не будет.

   
 
 автор: Trianon   (05.08.2007 в 23:18)   письмо автору
 
   для: Unkind   (05.08.2007 в 20:53)
 

Н-да...

$list = '10,8,9';
$sql = "SELECT * FROM tbl WHERE id IN($list) ORDER BY FIELD(id, $list)";

   
 
 автор: Зелим   (06.08.2007 в 02:02)   письмо автору
 
   для: Trianon   (05.08.2007 в 23:18)
 

Вот это тоже мне пригодится! :) Фэнкс!

   
 
 автор: Trianon   (05.08.2007 в 20:24)   письмо автору
 
   для: Зелим   (05.08.2007 в 19:40)
 

ORDER BY можно применять для вывода строк в явно указанном списком порядке ключей.
Смотреть нужно в сторону функции FIND_IN_SET()

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования