За последние 24 часа нас посетили 23633 программиста и 1713 роботов. Сейчас ищут 1717 программистов ...

Порядок в котором возвращает записи id IN (8, 5, 12, 4)

Тема в разделе "MySQL", создана пользователем Dmitriy A. Arteshuk, 3 апр 2017.

  1. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    День добрый господа!

    Имеем PDO, запрос

    Код (Text):
    1. SELECT * FROM table WHERE id IN (8,5,12,4)
    Беда вот в чем, этот запрос вернет строки из БД в таком порядке 4,5,8,12

    А никак нельзя вернуть в том порядке в котором я их перечисляю в IN?

    Вопрос связан вот с чем. Массив айдишников получается сфинском в результате сортировки ORDER BY, соответственно мне и надо получить записи именно в том порядке в котором сфинкс мне предлагает.

    Сортировать пыхом или PDO не предлагать! )
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    тут не надо сортировать, у тебя есть массив 8,5,12,4 в нужной сортировки и результат 4,5,8,12 пройдись foreach по 8,5,12,4 и выведи из 4,5,8,12 данные, вот и будет вывод в нужной сортировке
     
    Dmitriy A. Arteshuk нравится это.
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    Код (Text):
    1. SELECT * FROM `map_castle` WHERE ID IN(4,1,5,3) ORDER BY ID = 4 DESC, ID = 1 DESC, ID = 5 DESC, ID = 3 DESC
    Надо другой вариант...
     
  4. retvizan

    retvizan Активный пользователь

    С нами с:
    27 дек 2013
    Сообщения:
    68
    Симпатии:
    22
    SELECT * FROM table WHERE id IN (8,5,12,4) ORDER BY FIND_IN_SET(id, '8,5,12,4')
     
    Dmitriy A. Arteshuk нравится это.
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
  6. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Ну.....вариант конечно, но получится 2 обхода и в итоге надо собрать еще один результирующий массив, а данных там много (((

    Спасибо за наводку...но это не работает (((

    Код (Text):
    1. SELECT * FROM `table` WHERE `id` IN (4908534, 4906820, 5579047) ORDER BY FIND_IN_SET(id, '4908534, 4906820, 5579047')
    Вернуло 5579047,4906820,4908534, т.е. с точностью до наоборот (
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    что с моим вариантом ты два раза циклом пройдёшь, что с данными которые уже отсортированы из базы, тебе просто из базы надо сразу все данные получить в массив, а не перебирать их по строчке и в новый массив копировать.
    Тебе потом вывод этих данных делать или массив отправить куда-то?
    --- Добавлено ---
    Может там к ORDER BY нужно добавить ASC или DESC
     
  8. retvizan

    retvizan Активный пользователь

    С нами с:
    27 дек 2013
    Сообщения:
    68
    Симпатии:
    22
    используй field
    вместо find_in_set
     
  9. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Вывод потом
    DESC вернуло 4908534, 5579047,4906820 )))
    ASC 5579047,4906820,4908534
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    [​IMG]
     
    Dmitriy A. Arteshuk нравится это.
  11. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    @MouseZver Да, спасибо, это пашет, замерю по скорости работы (тут это ОЧЕНЬ важно!) и отпишусь
     
  12. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Вобщем хуйня все это ((((

    PHP:
    1. usort($array, function ($a,$b) { return $a['field'] > $b['field'];}); // по возрастанию
    2.  
    3. usort($array, function ($a,$b) { return $a['field'] < $b['field'];}); // по убыванию
    работает куда быстрее чем выборка через ORDER BY FIELD

    PHP наше все )))
     
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    o_O ухтыжептамытутголовуломать
    --- Добавлено ---
    а если массив из несколько сотен строк? unsort быстрее чем FIELD ?
     
  14. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    не замерял, у меня фикс 20 элементов, ни них usort быстрее
    Ну мозги чуть растрясли в обед ) Спасибо всем!
     
  15. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Код (Text):
    1. select * from table where id=8
    2. union
    3. select * from table where id=5
    4. union
    5. select * from table where id=12
    6. union
    7. select * from table where id=4
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    Это же, надо пройтись циклом для запихивания каждого id в каждый запрос, после имплодить ( 'union', array ), жиза:(
     
  17. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Настоятельно реквестирую бэнчмарк предложенных вариантов )
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    шо за слово ? :D
     
  19. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Просит показать )
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я за "брать из бд, как отдаёт, а рисовать, как сфинкс велит"
     
    denis01 нравится это.
  21. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Так и сделал )

    ОФФТОП

    Заметил странную фишку у сфинкса...он по дефолту выбирает 20 позиций

    увеличиваю лимиты LIMIT 1000000 OPTION max_matches=1000000

    Что на ляме позиций, что на 50 тысяч время работы почти одинаковое.....что за нах пока не пойму )
     
  22. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    облегчите участь нуба... что за сфинкс ? :D
     
  23. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Да шняга одна, оч быстро ищет по БД

    http://sphinxsearch.com/
     
    denis01 и MouseZver нравится это.