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

    −163

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    $query = $sql -> query("SELECT *, COUNT(`id`) as count FROM `d_download` WHERE `id` = '{$id}'", true);
    
    if($query['count'] == 1) {
     // code
    }

    Проверка, что значение найдено.

    Запостил: neTpyceB, 11 Апреля 2013

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

    • SELECT *,*,*,*,*,*,*,*,*, COUNT(`id`) as count

      Moar all columns!!!111
      Ответить
    • Гм. Если честно, выглядит синтетическим. А ещё меня смущает поведение mysql в этом случае. И оно касается отсутствия группировок.
      Ответить
    • Group by где
      Ответить
      • > $sql -> query("...", true);
        > , true);

        Возможно тут. Ну или в каждой результирующей строке.
        Ответить
      • Технически, такой запрос в mysql выполнится (я проверил).
        Остаются некоторые сомнения в его правильности, поскольку все поля из *, кроме id (и, соответственно, count) будут заполнены значениями из первой произвольно выбранной строки. Такие дела.
        mysql> select version();
        +-----------+
        | version() |
        +-----------+
        | 5.5.30    |
        +-----------+
        1 row in set (0.03 sec)
        Ответить
        • > Технически, такой запрос в mysql выполнится (я проверил).
          Это багофича мускуля. Слава богу, что отключаемая. Позволяет выбирать какое-попало значение для полей, которые не входят ни в агрегатные функции, ни в список полей для группировки.

          The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate.

          To disable the MySQL GROUP BY extension, enable the ONLY_FULL_GROUP_BY SQL mode.

          http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html
          Ответить
          • Я примерно так и думал, но искать подтверждение было лень. Спасибо.
            Ответить
            • Да я просто сам когда-то налетал на эту дурь, когда забыл внести поле в group by. Это был лютый батхерт ;)
              Ответить
        • > Проверка, что значение найдено.
          А вот походу это не проверка на существование записи, а проверка на ее существование и единственность. Кому-то было лень написать функцию, которая выполнит запрос и попробует сделать два фетча вместо одного, чтобы убедиться в том, что запись только одна, вот он и воспользовался этим грязным СУБД-зависимым хаком...
          Ответить

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