1. SQL / Говнокод #2807

    −144.2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    SELECT
        id, description_ru, description_en,
        FLOOR(LENGTH(TRIM(description_ru))/2+0.5) AS descr_ru,
        LENGTH(TRIM(description_en)) AS `descr_en`
    FROM items
    ORDER BY descr_ru desc;

    получает id, русское описание, английское описание, а потом размеры описаний
    и сортирует по размеру русского описания.
    база в UTF-8, поэтому размеры описаний в символах решил посчитать вот таким говноспособом...
    таблица >30 000 записей.
    Говнодиверсант какой-то :)

    Запостил: alexgray, 16 Марта 2010

    Комментарии (16) RSS

    • А правильный подсчёт длины текста utf8 поставит базу раком. Нормальная аппроксимация.
      Ответить
      • это ты щас о недосубд говномускуле ?
        Ответить
      • Если в базе только кирилаца/латиница и правильная работа с utf8 ставит раком, пользуйтесь однобайтной кодировкой, а не городите говновелосипеды.
        Ответить
        • утф - настоящее и будущее, однобайт - позапрошлый век.

          не надо изначально юзать кривые базы и не будет проблем на жопу.
          Ответить
          • > не надо изначально юзать кривые базы
            Более чем спорное утверждение. Есть рынок, софт, хостеры - не юзать mysql невозможно.
            Ответить
        • в базе есть и немцы и финны и кириллица...
          Ответить
      • Здесь проблема не в том ЧТО считать, а вообще ЗАЧЕМ производить вычисления. Для такого количества записей без индексов уже туговато, да только с таким запросом их не используешь. Как выход можно создать отдельное поле, где хранить длину описания, и проиндексировать его.

        Что касается поста, то лучше заюзать CHAR_LENGTH(). Иначе сортировка теряет всякий смысл с таким приближением и практически равносильна сортировке по RAND() ;)
        Ответить
        • * CHAR_LENGTH() - да, так уже и сделали.
          * RAND() - может быть, но что удивительно, пользователи этого не замечали 2 года :) Вернее жаловались, но не настойчиво...
          * "можно создать отдельное поле" - так наверное и сделаем, так как пользователи уже хотят длину без тегов и переводов строк.

          Спасибо.
          Ответить
          • А что за проект такой, где надо сортировать записи по их длине?
            Спец. олимпиада?
            Ответить
            • описание товара. иногда описание есть по-русски иногда по-анг.
              по размеру смотрят 1) есть описание и насколько оно большое 2) сколько символов перевел переводчик.
              Ответить
              • Но больше -- не значит лучше.
                Странно. Лучше бы за описание посетители звездочки ставили.
                Ответить
                • система внутренняя, посетителей нет. только сотрудники.
                  количество 1) используется начальником переводчиков для группировки по объему и выдачи заданий переводчику (25 маленьких или 5-7 больших на на день). поэтому точность и не была нужна.
                  А вот количество 2) это уже почти деньги, это то что переводчики перевели в символах.
                  Ответить
                  • Ну вот теперь все стало ясно. В таком случае, действительно, как было сказано выше, длину сообщений лучше хранить в отдельном столбце.
                    Если не хватает места, то можно купить новый хард.
                    А вот если не хватает производительности, то это уже может оказаться совсем иной бюджет.
                    Ответить
          • ололо
            жаловались, но не настойчиво©
            Внатуре, если клиенты не настойчиво* жалуются, зачем переделывать.

            *настойчивость жалобы определяется программистом
            Ответить
            • абсолютно точно. а потом он уволился.
              и мы теперь изучаем много всего...
              Ответить
    • Похоже на предпросмотр статьи. Для этого я бы создал отдельное поле. И длину текста считал бы скриптом, а в базе хранил бы только ранее посчитанные значения.
      Ответить

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