MYSQL сортировка с заранее определенным порядком

Статус
В этой теме нельзя размещать новые ответы.

Nafania

Профессор
Регистрация
24 Мар 2007
Сообщения
167
Реакции
46
Задача:
есть табличка примерно такая
id - int
....
date - int

Есть заранее определенный порядок вывода id, например как
5,2,7

Нужно выбрать из базы MYSQL данные так, чтобы сначала они шли в этом порядке с id, а далее по дате, то есть например есть
1 - 1221782400
2 - 1221782401
3 - 1221782402
4 - 1221782403
5 - 1221782404
6 - 1221782405
7 - 1221782406

и вывод мускуля должен быть

5 - 1221782404
2 - 1221782401
7 - 1221782406
(id закончились, дальше по дате)
6 - 1221782405
4 - 1221782403
3 - 1221782402
1 - 1221782400

ORDER BY id IN(5,2,7), date нужного результат не дает.

Такая сортировка в принципе возможна?
 
можно генерировать динамический sql в скрипте,
примерно так:

SELECT * FROM table WHERE id = 5
UNION
SELECT * FROM table WHERE id = 2
UNION
SELECT * FROM table WHERE id = 7
UNION
SELECT * FROM table WHERE id NOT IN (2,5,7) ORDER BY date DESC

может что напутал с синтаксисом, тут я просто показал идею
 
мускуль с ума сойдет, у меня этих заранее определенных id могут быть сотни :)
 
Одним только MySQL ты эту проблему не решишь.

Селекти ORDER BY DATE и выгребай сразу в два массива, а потом их склеивай:

PHP:
$ids = array(2,3,7,1);
$rows_by_id = array();
$rows_by_date = array();

$query = "SELECT * FROM table ORDER BY date";
$res = mysql_query($query);
while($o = mysql_fetch_array($res)) {
   if (in_array($o[id],$ids))  
       $rows_by_id[$o[id]] = $o;
   else 
       $rows_by_date[] = $o;
}

$rows = array();
foreach($i in $ids) $rows[] = $rows_by_id[$i];

$rows = array_merge($rows, $rows_by_date);
 
Возможен вариант завести еще 1 поле, например ordered - int, которое будет отвечать за порядок сортировки результата, проапдейтить записи и потом писать:
order ordered, date
Плюсом есть то что теперь набор сортировки id (5, 2, 7) не будет ограничен по количеству,
Недостатком являются подготовительные действия по апрейтам записей
 
Одним только MySQL ты эту проблему не решишь.

Селекти ORDER BY DATE и выгребай сразу в два массива, а потом их склеивай:
Да я по подобному механизму и делаю, думал мошт можно чисто мускулем решить.

Возможен вариант завести еще 1 поле, например ordered - int, которое будет отвечать за порядок сортировки результата, проапдейтить записи и потом писать:
order ordered, date
Не, не прокатит, ибо порядок каждый раз разный.
 
ну чудес на свете не бывает...
может имеет смысл как-то упорядочить логику выборок? (ввести группы, какие-то признаки или еще чего)
 
мускуль с ума сойдет, у меня этих заранее определенных id могут быть сотни :)
вот так не сойдёт.
SELECT * FROM table WHERE id IN (тут твоя сотня id)
UNION
SELECT * FROM table WHERE id NOT IN (и тут она же) ORDER BY date DESC


хотя нада конечно уточнить в мануале, сколько может быть параметров у IN (...)
 
проблема не в количестве параметров в IN, а в размере самого sql-запроса,
какое-то ограничение на размер есть, нужно доку смотреть
 
SELECT * FROM table WHERE id IN (3,5,1,7)

вернет записи с нужными тебе id, но не в нужном тебе порядке. Порядок будет 1,3,5,7. И ORDER BY ты к этому запросу никакой не прицепишь. То есть по-любому сортировать руками потом придется, самостоятельно.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху