Уважаемые, а по mySQL кто-то подскажет?
есть выборка. Простая. Типа
SELECT * FROM tabl WHERE id LIKE ‘%per%’ or nazv LIKE ‘%per%’ OR ‘description LIKE ‘%per%’
мне нужно что-то добавить, чтобы в результате оно сначала отдавало те результаты, где id LIKE ‘%per%’, потом nazv LIKE ‘%per%’ и последними description LIKE ‘%per%’. Очень не хочется делать три запроса.
Сейчас рядом нет программеров этого плана, но Гугль не помог 🙁

Tagged with →  

30 Responses to по mySQL кто-то подскажет?

  1. WebDev:

    используй юнион тогда :3

  2. Nirer:

    order by
    case
    when id LIKE ‘%per%’ then 1
    when nazv LIKE ‘%per%’ then 2
    when description LIKE ‘%per%’ then 3
    else null
    end

  3. SbVelo:

    Чисто теоретически — да, но ужасно не оптимально. Лучше уж, как предложили, с юнионом.

  4. Azore:

    простите, хуйню сморозил

  5. KapCap:

    зашёл прочитать коммент про sphinx 🙂

  6. MdaYes:

    SELECT * FROM tabl WHERE id LIKE ‘%per%’ or nazv LIKE ‘%per%’ OR description LIKE ‘%per%’
    order by case
    when id LIKE ‘%per%’ then 1
    when nazv LIKE ‘%per%’ then 2
    else 3
    end

    ну и по аналогии

  7. MdaYes:

    я буду читать комментарии, я буду читать комментарии

  8. MdaYes:

    Почему не оптимально?
    Проверил, база правда маленькая под рукой
    С кейсом: Showing rows 0 — 10 (11 total, Query took 0.0008 sec)
    С юнион: Showing rows 0 — 10 (11 total, Query took 0.0050 sec)

  9. AmtEkb:

    сам и написал! Молодец! 🙂

  10. AmtEkb:

    слишком уж запрос некрасивый: LIKE ‘%string%’ — не проиндексируешь. С юнионом придётся всю таблицу три раза считывать и каждую строку проверять регуляркой. С кейсом мы читаем строку только один раз, а проверяем три раза уже в памяти.
    Думаю, примерно так.

  11. 5auam:

    то есть разница в 6 с лишним раз даже на маленькой базе тебя не смущает?

  12. WebDev:

    наоборот раз база маленькая то такой тест вообще ничего не отражает, отклонение может быть больше самого времени работы запроса

  13. 5auam:

    Stephan-V: это уже другой вопрос. надо сделать хотя бы на маленькой базе тестов 100 каждого запроса, тогда можно экстраполировать.

  14. SkoLt:

    я на тестовой табличке из 112957 записей прогнал по три десятка раз все эти запросы. разница между юнионами и order by case просто ахуенная.

    в среднем запросы шуршали:
    — order by case за 250-300ms
    — union за 3500-3700ms

    и на explain’ах видно, что order by case делает один запрос и потом в памяти сортирует данные, а при юнионах мускуль делает три запроса к базе и трижды пересматривает всю таблицу, а так как выборка идет по разным полям, то иного развития ситуации и не предполагается.

    юнион наше всё только в случае, если мы никуда не спешим или если табличка не будет увеличиваться.
    а вообще — да, я как и чувак в комментариях ниже, зашел прочитать про сфинкс.

  15. 5auam:

    о! наконец-то вспомнили про эксплейны! 🙂

  16. SkoLt:

    причем если кидать абсолютно идентичные запросы с одинаковыми условиями, то вариант с case по всей видимости чуток кешируется мускулом и время выполнения начинает снижаться с 250-300ms до 190-200ms.

    вариант с юнионами, судя по всему, не кешируется вовсе и время работы запросов постоянно крутиться в районе 3,5 секунд с отклонением в 0,2-0,3 секунды в обе стороны.

    скриншоты могу предоставить, настройки дефолтные. 5.1.6/fedora 14 если чо

  17. SkoLt:

    explain иногда может подводить, а если его делать на маленькой таблице, то он может отличаться от explain’а этого же запроса на большой

  18. Vormo:

    SELECT SQL_NO_CACHE

  19. SkoLt:

    что ты хотел этим сказать?

  20. KapCap:

    и не говори, сам не сделаешь — никто не сделает

  21. Hctblack:

    Спасибо вам большое за подскажку, но что-то я не нашел в Инете, как в mysql_query( запустить тот запрос на 7 строк? Я вписывал вместо перевода строки n, но ругается всё-равно 🙁

  22. Tnonode:

    забей, чувак, дождись программиста 🙂

  23. Hctblack:

    Витя! :)))) Ну не могу я его ждать. И нету программистов тут. Или это слишком сложно?

  24. AmtEkb:

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

    SELECT * FROM tabl WHERE id LIKE ‘%per%’ or nazv LIKE ‘%per%’ OR description LIKE ‘%per%’ order by case when id LIKE ‘%per%’ then 1 when nazv LIKE ‘%per%’ then 2 when description LIKE ‘%per%’ then 3 else null end

  25. Hctblack:

    Это попробовал
    select * from egoist_exhibitors WHERE (mNazvRus LIKE ‘%эстет%’ OR mNazvEng LIKE ‘%эстет%’ OR mDesc LIKE ‘%эстет%’ OR mStand LIKE ‘%эстет%’ ) ORDER BY mNazvRus when mNazvRus LIKE ‘%эстет%’ then 1 WHEN mNazvEng LIKE ‘%эстет%’ then 2 else 3 end
    Результат:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘when mNazvRus LIKE ‘%эстет%’ then 1 WHEN mNazvEng LIKE ‘%эстет%’ then ‘ at line 1

  26. 5auam:

    mysql -h [IP] -u [USER] -D [DATABASE] -p —execute=»SELECT * FROM tabl WHERE id LIKE ‘%per%’ OR nazv LIKE ‘%per%’ OR ‘description LIKE ‘%per%’ ORDER BY CASE WHEN id LIKE ‘%per%’ THEN 1 WHEN nazv LIKE ‘%per%’ THEN 2 WHEN description LIKE ‘%per%’ THEN 3 ELSE NULL END»

    где, [IP] — IP базы, [USER] — пользователь, [DATABASE] — имя базы, и ещё тебя спросят пароль, если он есть. не получится — кидай, что пишет.

  27. 5auam:

    CASE забыл.

  28. 5auam:

    парсер известно кто. где длинное тире — там на самом деле два дефиса.

  29. Hctblack:

    Это я – слепая тупилка! Спасибо, господа!

Добавить комментарий