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

    −866

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    SELECT media.*
    FROM media
      INNER JOIN (
        SELECT hall_id, MIN(position) AS minpos
        FROM media
        GROUP BY zal_id
      ) AS b ON media.hall_id = b.hall_id AND
                IFNULL(media.position, 0) = IFNULL(b.minpos, 0)
    
    WHERE media.hall_id IN (...)
    GROUP BY media.hall_id

    Нужно выбрать только первый media для конкретных залов, с минимальной позицией, причем позиция может быть нулом. Вот такой костыльный запрос получился в итоге.

    Запостил: maksim_ovcharik, 28 Октября 2014

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

    • Ну тут одно из двух: или Вы не знаете про Window Functions http://msdn.microsoft.com/en-us/library/ms189461.aspx или Вы используете тупую говнобазу MySQL, в которой их нет (хотя во всех остальных базах в мире они есть, даже в постгре).

      В первом случае Вам надо читать ман, а во втором случае Вам надо завязывать с программированием, ибо человеку, работающему с MySQL нет места в профессии.
      Ответить
      • > даже в постгре
        Эй-эй. Не обижай слоньку. Это ж лучшая опенсурсная база...
        Ответить
        • Сольнька правда прекрасна, особенно в последних версиях. На самом деле не существует ни одного повода в мире использовать MySQL, кроме разве что монструозного проекта, завязанного на MySQL так сильно, что не отвязать. А новые проекты конечно же нужно начинать на слоньке.
          Ответить
          • Сишечка прекрасна, особенно в последних версиях. На самом деле не существует ни одного повода в мире использовать СУБД, кроме разве что монструозного проекта, завязанного на СУБД так сильно, что не отвязать. А новые проекты конечно же нужно начинать на сишечке.
            Ответить
            • Мир программирования прекрасен, особенно в последних версиях. На самом деле не существует ни одного повода Вам рассуждать о программировании, кроме разве что монструозного проекта у Вас в голове, завязанного на этот сайт так сильно, что не отвязать. А новые проекты конечно же Вам начинать не нужно.
              Ответить
              • Копаться в чужом коде прекрасно, особенно в последних версиях. На самом деле не существует ни одного повода в мире начинать проект с нуля, кроме разве что монструозного проекта, завязанного на инновациях так сильно, что не отвязать. А проекты с нуля конечно же лучше никогда не начинать.
                Ответить
                • А ведь что-то в этом есть...

                  В опенсурсе каждый начинает свой проект, вместо того, чтобы объединиться и доделать. Ведь начинать, как правило, интересней, чем доводить до ума. Из-за этого там 100500 плееровЮ, десктопов и прочего говна, и все кривые.
                  Ответить
                • Ваше утверждение верно. Так же верно как и мое утверждение о том, что юзать мускуль не стоит.
                  Ответить
      • ifnull а также * + group by разве всё ещё не однозначно указывают на прокажённого?
        Ответить
    • >> GROUP BY zal_id

      что за zal_id?
      Ответить
    • делать
      SELECT media.* с GROUP BY , это..
      ты на правильный сайт попал!
      Ответить
      • И, вроде как, такую хрень только мускуль позволяет.
        Ответить
        • показать все, что скрыто-
          Ответить
        • А можно мне, глупенькому, объяснить, чем это плохо?
          Ответить
          • Лучше сам попробуй на вкус.
            Ответить
          • > чем это плохо
            Чтобы ответ был детерминированным, все поля должны попасть либо в group by, либо в какую-нибудь агрегирующую функцию (avg, min и т.п.). И все вменяемые СУБД это проверяют.

            Мускуль же позволяет оставить поле и без группировки и без агрегации. В итоге он выбирает какое-то значение из группы. Какое именно - а хуй знает. Всё зависит от фазы луны и настроения оптимизатора.

            В общем очередная говнофича мускуля, включенная по умолчанию.
            Ответить
            • >Мускуль же позволяет оставить поле и без группировки и без агрегации. В итоге он выбирает какое-то значение из группы. Какое именно - а хуй знает.

              >В общем очередная говнофича мускуля, включенная по умолчанию.
              Вроде в T-SQL так же. Хотя я точно не помню включено ли оно по дефолту.
              Ответить
              • Ну вот зачем такое делать? Лучше бы сделали агрегатную функцию мнепохуй для любителей пооптимизировать:
                select мнепохуй(a), мнепохуй(b), мнепохуй(c), d from t group by d
                А всем остальным эта фишка только мешает, замалчивая реальные ошибки.
                Ответить
                • >Ну вот зачем такое делать?
                  Ну это ж РАСШИРЕНИЕ! В ANSI ж дураки сидят, запрещают всё.
                  http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36272.1570/html/commands/X96182.htm
                  Ответить
                  • Кстати, судя по доке, в transact-sql оно работает не так, как в мускуле.

                    В мускуле выбирается неизвестно какая строка. В transact-sql - все, просто сгруппированные и заагрегированые поле в них дублируются - т.е. это всего лишь безобидный аналог over'а, а не недетерминированная питушня.
                    Ответить
                    • а разве оно вообще в t-sql пашет?

                      а как же
                      Column 'FOOO' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.?
                      Ответить
                      • Я его не юзал. За что купил, за то и продал. Выше Пи кидал доку, вот из нее это взято (кстати, в доке sybase, а не m$$ql).
                        Ответить
                        • а я думал что МКАДом жизни нет, и t-sql бывает только у мс
                          Ответить
                          • > и t-sql бывает только у мс
                            Ну вообще-то они по своему обыкновению спёрли его, потом расширили/переделали. Как ту же жабу, например.
                            Может просто опцию по дефолту выключили, а она где-то там в недрах и сидит.
                            Ответить
                            • Я вспомнил что они сперли его у сайбейза, да
                              Но я думаю что от него уже ничего не осталось.

                              Собссно NT тоже сделали на основе кое-какой операционки)
                              Ответить
                              • И о ужас! даже DOS они какому-то чуваку заказали, а потом допиливали.
                                > Но я думаю что от него уже ничего не осталось.
                                Но они во многом похожи. Синтаксис паскальный, опции и прочее.
                                Ответить
                        • $yba$e vs m$$ql
                          Ответить
                  • > РАСШИРЕНИЕ
                    Вот почему-то все пытаются навязать мне свои расширения... gcc, msvs, mysql... Все включают расширения по-умолчанию, и я почему-то должен их отключать, чтобы случайно не поюзать (или, в случае с мускулем, не залететь на что-нибудь ужасное). Ладно, блин, платные проги - можно списать на vendor lock. Но опенсурс то зачем этим страдает?

                    Имхо, по умолчанию, система должна работать максимально близко к стандарту. А если мне чего-то не хватит - так и быть, включу.
                    Ответить
              • совершенно не так в T-SQL

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

                Зачем Вам вообще реляционная база?
                Ответить
                • Мм, для хранения данных. Групировку юзал один раз в жизни, при этом выложив тот запрос на ГК.
                  Ответить
                  • понятно;)
                    Ответить
                  • Тогда посмотри в сторону nosql решений. Монги всякие и т.п. Может понравится...

                    Если нету группировок да джойнов, а нужна только выборка документов по ключу - само то.
                    Ответить
                    • Хз, привык уже к SQL-синтаксису, удобненько. NOSQL вряд ли сильно увеличит производительность.
                      Ответить
    • попробуй как-то так:
      select hall_id, isnull(position,0) as min_position
      from media
      group by hall_id
      having isnull(position,0) = min (isnull(position,0))
      Ответить
    • показать все, что скрыто-
      Ответить
    • показать все, что скрыто-
      Ответить

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