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

Тема в разделе "Базы данных", создана пользователем Nafania, 19 сен 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Nafania

    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 нужного результат не дает.

    Такая сортировка в принципе возможна?
     
  2. ozware

    ozware

    Регистр.:
    22 апр 2007
    Сообщения:
    327
    Симпатии:
    42
    можно генерировать динамический 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

    может что напутал с синтаксисом, тут я просто показал идею
     
  3. Nafania

    Nafania

    Регистр.:
    24 мар 2007
    Сообщения:
    167
    Симпатии:
    46
    мускуль с ума сойдет, у меня этих заранее определенных id могут быть сотни :)
     
  4. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Одним только 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);

     
  5. pslava

    pslava

    Регистр.:
    16 май 2007
    Сообщения:
    618
    Симпатии:
    122
    Возможен вариант завести еще 1 поле, например ordered - int, которое будет отвечать за порядок сортировки результата, проапдейтить записи и потом писать:
    order ordered, date
    Плюсом есть то что теперь набор сортировки id (5, 2, 7) не будет ограничен по количеству,
    Недостатком являются подготовительные действия по апрейтам записей
     
    pavel012007 нравится это.
  6. Nafania

    Nafania

    Регистр.:
    24 мар 2007
    Сообщения:
    167
    Симпатии:
    46
    Да я по подобному механизму и делаю, думал мошт можно чисто мускулем решить.

    Не, не прокатит, ибо порядок каждый раз разный.
     
  7. zerdek

    zerdek

    Регистр.:
    29 ноя 2007
    Сообщения:
    346
    Симпатии:
    50
    ну чудес на свете не бывает...
    может имеет смысл как-то упорядочить логику выборок? (ввести группы, какие-то признаки или еще чего)
     
  8. skabbit

    skabbit Постоялец

    Регистр.:
    6 дек 2007
    Сообщения:
    88
    Симпатии:
    1
    вот так не сойдёт.
    SELECT * FROM table WHERE id IN (тут твоя сотня id)
    UNION
    SELECT * FROM table WHERE id NOT IN (и тут она же) ORDER BY date DESC


    хотя нада конечно уточнить в мануале, сколько может быть параметров у IN (...)
     
  9. ozware

    ozware

    Регистр.:
    22 апр 2007
    Сообщения:
    327
    Симпатии:
    42
    проблема не в количестве параметров в IN, а в размере самого sql-запроса,
    какое-то ограничение на размер есть, нужно доку смотреть
     
  10. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    SELECT * FROM table WHERE id IN (3,5,1,7)

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