Ответы пользователя по тегу MySQL
  • Какой запрос сделать к базе данных?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    SELECT
        subquery.opponent_id,
        subquery.last_message_datetime,
        m.message AS last_message
    FROM (
        SELECT
            CASE
                WHEN m.from_user_id = 4 THEN m.to_user_id
                ELSE m.from_user_id
            END AS opponent_id,
            MAX(m.datetime) AS last_message_datetime
        FROM messages AS m
        WHERE m.from_user_id = 4 OR m.to_user_id = 4
        GROUP BY opponent_id
    ) AS subquery
    LEFT JOIN messages AS m ON (
        (m.from_user_id = 4 AND m.to_user_id = subquery.opponent_id)
        OR
        (m.to_user_id = 4 AND m.from_user_id = subquery.opponent_id)
    ) AND m.datetime = subquery.last_message_datetime
    Ответ написан
  • Как оптимизировать таблицу с JSON строкой в mysql?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Если вы уверены в том, что в обозримом будущем вам не понадобится поиск по другим полям или вы точно не захотите сделать join с их участием, то json будет работать быстрее. И сохранять его проще.
    А если потом захотите, то придётся создать дополнительные таблицы, и сохранить как нормализованные данные.
    Но эта задача не сложна и всего лишь потенциальна (может и не понадобится).
    Ответ написан
    6 комментариев
  • Не работает INSERT INTO, почему?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Если insert into вызывает ошибку из-за дубликата, это можно решить разными способами.
    1. Перед вставкой выполнить запрос, проверяющий, есть ли такая запись.
    2. Использовать insert ignore into. Это приведёт к тому, что при наличии дубликата запись не будет добавлена, но при этом выполнение скрипта продолжится.
    3. Использовать replace into. В этом случае старая запись будет заменена новой. Но если у какой-то другой таблицы создана связь с этой посредством foreign key с каскадной реакцией, это приведёт к удалению всех ссылающихся на этот ключ записей.
    4. Использовать on duplicate key update:
    insert into films (img, img_vertical, trayler...) values (:img, :img_vertical, :trayler...)
      on duplicate key update  
    set img = :imgUpd , img_vertical = :img_verticalUpd, trayler = :trayler итд  ...;

    прочее

    Часть ответа пришлось удалить, поскольку за педагогические услуги мне не платят.
    Ответ написан
  • Как сделать в MySQL изменение поля строки через время?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Вообще это очень нерационально гонять mysql почем зря каждую секунду.
    Более целесообразно при выборке вместо поля suc проверять разницу текущего времени с полем date.
    например
    select * from tableName where `date` > now() - interval 10 day

    А если suc принципиально нужен, то:
    select id, login, `date`, (`date` > now() - interval 10 day) as suc from tableName
    Ответ написан
    Комментировать
  • Почему не запускается MySQLD в wamp 3.3.0?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Вероятнее всего MySQL уже запущен каким-то другим сервисом.
    Если не хотите удалять, попробуйте сменить порт.
    Ответ написан
    2 комментария
  • Может ли быть вложенным Foreign Key?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Может, но это бессмысленно.
    Ваш преподаватель, я думаю, учит вас бесполезному.
    Попробуйте так:
    649603d70c033571227365.png
    Это избавит вас от потенциальных проблем с целостностью данных и позволит поручить контроль над задачей нескольким руководителям.
    Ответ написан
    Комментировать
  • Как правильно использовать PDO если несколько php скриптов?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    1. В обычном штатном случае скрипт один, если вы сознательно не запускали каких-либо асинхронных процессов.
    Даже если в ходе выполнения подключаются другие файлы (include или require), то скрипт всё равно один.
    Когда скрипт выполнен, открытые соединения прекращаются автоматически.

    2. Я делаю примерно так:
    class DB
    class DB
    {
        public ?PDO $pdo;
        private ?array    $opt;
        public ?string $pHolders;
        public ?array  $parArr;
    
        public function __construct(
            string $connectName = '',
            string $charset = 'utf8mb4',
            bool $flat = false
        )
        {
            if($flat) return;
    
            $con = ConnectDB::byName($connectName);
    
            $dsn = "mysql:host=$con->host;dbname=$con->name;charset=$charset";
            $this->opt = [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES   => FALSE
            ];
            $this->pdo = new PDO($dsn, $con->user, $con->pass, $this->opt);
        }
    
        public function qwe($sql, $args = NULL): bool|PDOStatement
        {
            if (!$args) {
                return self::query($sql);
            }
            return self::execute($sql, $args);
        }
    
        private function execute(string $sql, array $args): PDOStatement
        {
            $stmt = $this->pdo->prepare($sql);
            $stmt->execute($args);
            return $stmt;
        }
    
        private function query($sql): PDOStatement
        {
            return $this->pdo->query($sql);
        }
    }


    Объявляю функцию в файле и подключаю его с помощью autoload в composer.json
    spoiler
    function qwe(string $sql, array $args = null): bool|PDOStatement
    {
        global $DB;
    //Синглтон
        if(!isset($DB)){
            $DB = new DB();  
        }
        return $DB->qwe($sql,$args);
    }


    Вызываю:
    $qwe = qwe("Select * from users where id = :id", ['id' => $id]);
    Ответ написан
    Комментировать
  • Не добавляется строка в Бд через postman что делать?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Гуглите:
    1. PDO
    2. Логирование ошибок MYSQL
    mayton2019 правильно говорит, что вставка в бд выполняется командой INSERT INTO
    Ответ написан
    Комментировать
  • Как исправить ошибку синтаксиса mysql?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Если вы не используете PDO, то по крайней мере уж не пихайте выражения в формирование строки sql.
    И константы тоже не пихайте.
    Подготовьте переменные заранее. Так, чтобы они без закрытия кавычек и конкатинации вставлялись.
    Тогда IDE сама всё подскажет и вам не придётся насиловать мозг ни себе ни окружающим.
    Ваш sql сейчас настолько нечитаем, что в нём даже нет смысла ковыряться.

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

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Обойтись без плейсхолдеров можно в случаях, когда вы точно уверены в типе, валидности и происхождении данных.
    На начальных этапах следить за этим не сложно. Но ваше приложение будет развиваться и расти. Помнить что где и откуда станет труднее. В моей практике и вовсе был случай, когда я, допустив ошибку, сам себе сделал инъекцию после которой пришлось поднимать бд из бэкапа.
    Сам процесс принятия решения плейсхолденить или не плейсходерить - уже когнитивный труд. А трудолюбие обратно пропорционально интеллекту. Проще всё всегда плейсхолдерить и жить спокойно. При этом освободившийся ресурс мозга найдет себе более рационально применение.
    Ответ написан
    Комментировать