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

Форум MySQL

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

 

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

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

тема: вывод из базы в порядке "как задал"
 
 автор: Axxil   (03.03.2006 в 10:00)   письмо автору
 
 

Делаю запрос

select * from table where field=5 and id in (7,3,4,1,5) group by id

И хочу что бы сортировка была именно в таком порядке по id. Как это можно сделать?

   
 
 автор: Loki   (03.03.2006 в 10:25)   письмо автору
 
   для: Axxil   (03.03.2006 в 10:00)
 

Думаю, тут могло бы помочь объединение запросов с помощью UNION

   
 
 автор: Trianon   (03.03.2006 в 10:58)   письмо автору
 
   для: Axxil   (03.03.2006 в 10:00)
 

А order by id чем не устраивает?

   
 
 автор: Axxil   (03.03.2006 в 11:09)   письмо автору
 
   для: Trianon   (03.03.2006 в 10:58)
 

тем что не работает :)

   
 
 автор: Trianon   (03.03.2006 в 11:24)   письмо автору
 
   для: Axxil   (03.03.2006 в 11:09)
 

А какой целью стоит group by, если ни having by, ни агрегатные функции не вызываются? Может оно и мешает?

   
 
 автор: Loki   (03.03.2006 в 11:39)   письмо автору
 
   для: Trianon   (03.03.2006 в 11:24)
 

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

   
 
 автор: Trianon   (03.03.2006 в 11:54)   письмо автору
 
   для: Loki   (03.03.2006 в 11:39)
 

Ах вот оно что.... :))
Тогда я бы написал что-то вроде
select * from maintable natural join sorttable where .... order by sorttable.sortorder
или (в оракловом стиле)
select * from maintable,sorttable where .... maintable.id = sorttable.id and ...... order by sorttable.sortorder

   
 
 автор: Axxil   (03.03.2006 в 12:07)   письмо автору
 
   для: Trianon   (03.03.2006 в 11:54)
 

Какая sorttable 8-0 ?
Там всего одна таблица.
Короче...
Сводим вопрос к теоретическому
Можно ли в принципе выводить записи в заданном порядке. Поле autoincrement есть в наличии.
Типа:
select * from table where field in (список) order by список

   
 
 автор: Trianon   (03.03.2006 в 12:20)   письмо автору
 
   для: Axxil   (03.03.2006 в 12:07)
 

Можно. Если добавить поле с критерием сортировки. Или таблицу с таким полем. Или (совсем уж теоретически) функцию в mysql всунуть, которая будет задавать такой критерий.
И нельзя. Если критерий никак не обозначить.
список в Вашем понимании - (как определение не множества значений, не порядка оценки полей, а определение самого порядока значений) - не покатит.
А autoincrement тут вроде как не играет роли. Он влияет лишь на добавление новых строк.

   
 
 автор: Axxil   (03.03.2006 в 12:38)   письмо автору
 
   для: Trianon   (03.03.2006 в 12:20)
 

Из таблицы в тыщу строк мне нужно выбрать порядка десяти... И для этого создавать дополнительную справочную таблицу или поле? Да уж... А если это несколько раз надо будет провернуть для разных таблиц... Неужели нет нормальной реализации этой проблемы?

>А autoincrement тут вроде как не играет роли. Он влияет лишь на добавление новых строк.
Не только... Он незаменим, когда в таблице нет поля "дата добавления" для определения порядка добавления записей в таблицу.

Хотя в данном случае согласен, он нафиг не нужен :)

По-моему в mysql можно на лету (прямо в запросе) создавать дополнительные поля. Может через это получится?

   
 
 автор: Trianon   (03.03.2006 в 12:54)   письмо автору
 
   для: Axxil   (03.03.2006 в 12:38)
 

Так ужасно temporary table создать?
Можно и без нее, но код будет еще ужаснее.
что-то вроде

SELECT * 
FROM table
NATURAL JOIN (
            select 7 as id , 1 as ordr 
union 
            select 3 as id , 2 as ordr 
union 
            select 4 as id , 3 as ordr 
union 
            select 1 as id , 4 as ordr 
union 
            select 5 as id , 5 as ordr 
) AS ordtab 
order by ordr

Это работает, я проверил. Но меня от этого тошнит. А Вас?
Кстати, для десяти строк результат можно и PHP-средствами отсортировать.... Хотя это и не пафосно, согласен.

   
 
 автор: Axxil   (03.03.2006 в 12:57)   письмо автору
 
   для: Trianon   (03.03.2006 в 12:54)
 

> Но меня от этого тошнит. А Вас?
Есть такое дело...
Раньше я везде такую конструкцию ваял, пока про in мне не рассказали :)

О, а вроде и temporary table тоже можно на лету создавать... А как?
Блин, дома книжка, где всё это отлично разжёвано, только вечером доберусь...

   
 
 автор: Loki   (03.03.2006 в 13:03)   письмо автору
 
   для: Axxil   (03.03.2006 в 12:57)
 

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

   
 
 автор: Axxil   (03.03.2006 в 13:11)   письмо автору
 
   для: Loki   (03.03.2006 в 13:03)
 

Хостер ручной :)

Но, согласен зачем мышей бомбами закидывать...
Хорошо объясню проблему полностью.
На входе имеем массив

$arr = array(32,43,45,43,1,2,4);

Этот массив классически закидывается в запрос:

<?
$str 
implode(",",$arr);
$str substr($str,0,strlen($str)-1);
$sql 'select * from table where field in ('.$str.') order by field';
?>

На выходе получаем обычную сортировку по полю.
ОК, я уже согласен на сортировку средствами PHP, но не вижу элегантного решения как вывод запроса отсортировать в порядке значений массива $arr.
Можно конечно нагородить циклов, но не хочется...

   
 
 автор: Trianon   (03.03.2006 в 13:23)   письмо автору
 
   для: Axxil   (03.03.2006 в 13:11)
 

while(($row=mysql_fetch_array($res)) != 0)
rows[] = $row;
usort(rows, comparer);

   
 
 автор: Axxil   (03.03.2006 в 13:41)   письмо автору
 
   для: Trianon   (03.03.2006 в 13:23)
 

Так я тоже могу :)
только в этом comparer всё и заключается.
Как туда передать исходный массив $arr и как проводить сравнение... Всё равно трёхэтажно получится

   
 
 автор: Trianon   (03.03.2006 в 13:58)   письмо автору
 
   для: Axxil   (03.03.2006 в 13:41)
 

Придется сортир глобальным сделать. Противно, но для такого случая приемлемо.
function comparer($a, $b) { global $revarr; return $revarr[$a['id']] - $revarr[$b['id']]; }
....
global $revarr;
$revarr = array();foreach($arr as $k=> $v) $revarr [$v]=$k;

   
 
 автор: Trianon   (03.03.2006 в 13:14)   письмо автору
 
   для: Axxil   (03.03.2006 в 12:57)
 

Книжку наверное можно тут найти http://dev.mysql.com/doc/refman/4.0/ru/index.html
Да только стоит подумать, может и вправду таблицу постоянной сделать?

   
 
 автор: Axxil   (03.03.2006 в 13:18)   письмо автору
 
   для: Trianon   (03.03.2006 в 13:14)
 

Теперь у меня уже спортивный интерес появился. Просто так не сдамся :)

   
 
 автор: Axxil   (03.03.2006 в 12:03)   письмо автору
 
   для: Trianon   (03.03.2006 в 11:24)
 

не, ну там вызывается count, это я для экономии написал основные моменты запроса.

   
 
 автор: Axxil   (03.03.2006 в 15:05)   письмо автору
 
   для: Axxil   (03.03.2006 в 10:00)
 

Не сработал usort, пришлось реализовать в цикле с использование дополнительного массива.

<?
    
while($r=mysql_fetch_assoc($query)){
      
$ret[$r['id']] = $r;
    }
    foreach(
$arr as $v){
      
array_push($ret1,$ret[$v]);
    }    
?>

   
Rambler's Top100
вверх

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