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

    −115

    1. 1
    SELECT id, login, 0 AS shows, 0 AS clicks, 0 AS money FROM users WHERE is_adv=1 AND is_blocked=0 AND (shows <> 0 AND clicks <> 0 AND money <> 0)

    Запостил: peredozo, 07 Ноября 2011

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

    • И в чем говно? Контекста нет, описания нет, вижу нормальный SQL-запрос.
      Ответить
      • > 0 AS shows
        > shows <> 0
        are you blind?

        похоже на заглушку
        Ответить
        • Ну так это и есть заглушка. В чем говно, если вы сами понимаете, что это заглушка?
          Ответить
        • Еще раз говорю - без контекста абсолютно непонято говнокод это или нет. Это обычный SQL-запрос с обычными условиями.
          Если бы автор этого "говнокода" сказал, что сие балансы пользователей потом выводит в продакшен-схеме, то было бы другое отношение.
          Ответить
          • Я, конечно, не мускульный гуру, но я испытал когнитивный диссонанс при виде этого запроса.
            Ответить
            • ты не один.

              меня всегда умиляло когда народ просит базу послать им констант пачку.
              Ответить
              • чего умиляться-то? Жаль, что не могу найти продакшн-код, но:
                у вас есть 2 таблицы, которые по структуре своей почти одинаковые кроме 1 столбца (скажем, sum) и вам нужно сделать UNION. Первая таблица InnoDB и используется, вторая таблица - архивная. Вопрос: как делать UNION?

                select col1, sol2, sum from table1 UNION 
                select col1, col2, 0 as sum from table2


                В этом случае вам нужно просто "подогнать" столбцы, этот пример можно рассматривать так: sum в table2 всегда имеет дефолтное значение (0), т.к. самого column'а в таблице не существует.
                А еще можно так:
                select col1, sol2, "production" as `from` from table1 
                UNION select col1, col2, "archive" as `from` from table2


                думаю, понятно, что к чему.

                Если вы не сталкивались с надобностью делать подобные вещи, это не обозначает, что это обязательно говнокод.

                P.S. (я понимаю, что на меня сейчас же накинутся с замечаниями мол, да тут не нужен UNION! Сделай 2 селекта!) пример с UNION далеко не единственный вариант почему может потребоваться ставить подобные заглушки, но так делать это нормально.
                Ответить
                • Плохой пример, т.к. в ОП-посте взаимоаннигилирующиеся условия. Это ни разу не подгонка под union.

                  Надо было оправдываться, что это динамически генерируемый запрос и в данном случае просто так карта легла, что результат получается заведомо пустой. Тогда бы прокатило.
                  Ответить
                  • Там нет "взаимоаннигилирующихся условий" :) Читается примерно так:

                    > "где кол-во показов не 0, кол-во кликов не 0 и бабла не 0, но в результате сделать подмену на нули. Зачем? Хуй знает!"

                    На самом деле мы тут воду в ступе переминаем :-) От это спора никто кто поумнеет - конструктива-то нет. Моя позиция понятна, позиция оппонентов мне тоже понятна, - выглядит говнокодисто, - я согласен.
                    Ответить
                • > Если вы не сталкивались с надобностью делать подобные вещи, это не обозначает, что это обязательно говнокод.

                  сталкивался, и юнионы у нас на проекте тоже в таком духе используются.

                  но вот то что сверху стоит напоминает не заглушку, а хак: запрос поменять проще чем код, поэтому меняем только запрос и меняем его таким образом что бы код работал как и раньше. теперь представь что в базе в `users` есть милион записей: и на два поля с информацией, посылается еще и три константы. другими словами 60% передаваемой информации заранее известна клиенту, но все равно тащится по сети из базы. на кой хер?
                  Ответить
                  • Либо вы перфекционист, либо мыслите мелко. Вы не будете задумываться о том, что у вас на 20 байт больше в одной строке результата отдается, чем можно было бы. То, что вы описываете - микрооптимизация, а 2 миллиона записей я вообще не советую таскать из базы за один присест.
                    Ответить
    • показать все, что скрытоvanished
      Ответить

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