Ответы пользователя по тегу MySQL
  • Как переписать OdbcCommand для массовой вставки?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    А сама база не сможет выполнить запрос вставки по выборке?
    insert into org_iogjt_import_org_gate_job_title (iogjt_jobtitle_id, iogjt_jobtitle_name, iogds_datasource_id) 
        SELECT KSLP, NSLP, 1 FROM SLP WHERE KSLP <> 0 ORDER BY KSLP ASC

    Тогда можно просто выполнить запрос, без цикла и без параметров.
    Ответ написан
  • Как лучше организовать структуру таблиц?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вот почитайте мою статью, в ней как раз рассказывается о вашей проблеме:
    Реализация системы тегов в админке с бандлом Sonat...
    Ответ написан
    Комментировать
  • Почему symfony2 при чистке кеша лезет в базу?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    При запуске консольной команды запускается ядро (kernel), который парсит параметры из config.yml и инициализирует бандлы. Бандл доктрины при этом присоединяется к БД. Можно ли что-то с этим сделать, я не знаю.
    Может, выходом будет сделать свой собственный уровень окружения (environment), в котором не добавлять бандл доктрины, и запускать это окружение при вызове консольной команды.
    Ответ написан
    Комментировать
  • Стоит ли использовать типы данных ENUM & SET в БД MySQL?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Set я не использовал, а вот Enum использую успешно. Используется он очень просто. Причём я создаю отдельный класс для каждого enum-а в проекте, что даёт некоторые преимущества, например, простой доступ к массиву допустимых значений.

    Я создаю в проекте папку DBAL, и там создаю такие классы:
    <?php
    
    namespace AppBundle\DBAL;
    
    use Doctrine\DBAL\Types\Type;
    use Doctrine\DBAL\Platforms\AbstractPlatform;
    
    abstract class EnumType extends Type
    {
        protected $name;
    
        public static $VALUES = array();
    
        public static function getValues()
        {
            return array_combine(static::$VALUES, static::$VALUES);
        }
    
        public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
        {
            $values = array_map(function($val) { return "'".$val."'"; }, static::$VALUES);
    
            return "ENUM(".implode(", ", $values).") COMMENT '(DC2Type:".$this->name.")'";
        }
    
        public function convertToPHPValue($value, AbstractPlatform $platform)
        {
            return $value;
        }
    
        public function convertToDatabaseValue($value, AbstractPlatform $platform)
        {
            if (!in_array($value, static::$VALUES)) {
                throw new \InvalidArgumentException("Invalid value '$value' for enum '$this->name'.");
            }
            return $value;
        }
    
        public function getName()
        {
            return $this->name;
        }
    }

    Этот класс является базовым для кастомных классов Enum-ов, вот пример одного такого:
    <?php
    
    namespace AppBundle\DBAL;
    
    class GenderType extends EnumType
    {
        protected $name = 'gender';
        public static $VALUES = array('male', 'female');
    }

    Теперь нужно научить доктрину их использовать:
    doctrine:
        dbal:
            # ...
            types:
                gender: AppBundle\DBAL\GenderType
            mapping_types:
                enum: string
                gender: gender

    Теперь можно использовать в описаниях сущностей:
    <?php
    
    namespace AppBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Gedmo\Mapping\Annotation as Gedmo;
    
    /**
     * @ORM\Entity
     */
    class Person
    {
        // other fields
    
        /**
         * @var string
         *
         * @ORM\Column(type="gender")
         */
        protected $gender;
    
        // setters & getters
    }

    И в любом месте кода можно получить список доступных значений:
    foreach (GenderType::$VALUES as $gender) {
        echo $gender;
    }


    Насчёт типа SET - думаю, нужно написать подобный класс, умеющий переводить из значения php в формат sql, который корректно сохранит в поле. Но по мне, для языков лучше использовать simple_array, и не мучаться с ними.
    Ответ написан
    4 комментария
  • Как правильно обработать данные из mysql БД?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Если бы все данные были в одной записи, можно было бы просто вывести сумму в select:
    SELECT sm1_to+sm1_po1+sm1_po2 AS `hours` FROM full WHERE id_prepodavatel = 1

    Но у вас разные строки (я так понял, по одной колонке заполнены в каждой записи).
    Тогда нужно добавить GROUP BY disciplina и указать sum(sm1_to)+sum(sm1_po1) и т.д.
    Но основная проблема у вас не в этом - вам нужно переделать таблицу и не делать так много колонок. Каждый раз, когда у вас начинаются колонки со странными названиями, всегда возникает вопрос - а правильно ли спроектирована таблица?
    Можно сделать что-то типа такого:
    id int(11) NOT NULL AUTO_INCREMENT,
      disciplina varchar(255) DEFAULT NULL,
      nomer_gr varchar(255) DEFAULT NULL,
      type int(11) NOT NULL,
      hours int(11) NOT NULL DEFAULT 0,
      vakansiya int(11) DEFAULT NULL,
      id_prepodavatel int(11) DEFAULT NULL,
      PRIMARY KEY (id)

    То есть разбить одну длинную запись на множество маленьких, у каждой из которых указан тип.
    И тогда будет очень просто просуммировать через GROUP BY:
    SELECT id_prepodavatel, disciplina, sum(hours) AS `hours` FROM full WHERE id_prepodavatel = 1 GROUP BY disciplina

    Тип записи будет указывать, какие именно часы указаны в этой записи. Можно сделать числовым типом (как я указал выше), а можно сделать enum. В типе и будут все эти ваши sm1_to, sm1_po1, sm1_po2 и другие. Количество строк в таблице увеличится примерно в 20 раз (1500 * 20 = 30000), но в этом нет ничего страшного.
    Заодно, если добавится новая группа, то вам не надо будет менять структуру таблицы.
    Ответ написан
    4 комментария
  • Какую таблицу с юзерами использовать?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    customer - клиент, тот, кто будет покупать у вас на сайте.
    user - пользователь сайта с точки зрения администрирования, то есть тот, кто имеет доступ к админке, человек из вашей команды.
    При регистрации клиенты должны создаваться в таблице customer.
    Но что значит "Какую нужно использовать, когда юзер регистрируется и почему?" - разве они не сами там создаются?
    Ответ написан
    Комментировать
  • Как найти и заменить текст в базе данных mysql?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    UPDATE articles SET text = REPLACE(text, '8-927-123-45-67', '8-927-123-76-54') WHERE text LIKE '%8-927-123-45-67%'
    Ответ написан
  • Где ошибка в коде?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    if (!mysql_query("SELECT ...") {
    функция mysql_query возвращает не результат, а ресурс - указатель на результат, который нужно передать в одну из функций mysql_fetch_* или mysql_result. Ресурс приравнивается к true, и условие всегда ложно.
    А вообще, не используйте больше функции mysql_* - они устарели и скоро будут удалены из php. Используйте PDO или mysqli. Почитайте вот это для подробных объяснений.
    Ответ написан
    6 комментариев
  • Как список значений в браузере внести в базу Mysql?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Если я понял, вам нужно множественными запросами получать несколько страниц с текстом, и преобразовывать его в набор данных.
    Для этого хорошо подойдёт multi_curl (оф.дока, статья на хабре). А дальше уже парсить строку в набор данных (массив, очевидно), и добавлять в базу. Можно сначала накачать страничек и поскидывать их на диск, а потом спокойно парсить их.
    Если тот сервер отдаёт HTML, то без парсинга не обойтись. Но если структура отдачи однозначна и проста, то парсинг проблем создать не должен.
    Ответ написан
    Комментировать