• Как составить правильный запрос к бд?

    @Akina
    Сетевой и системный админ, SQL-программист.
    ...
    HAVING COUNT(*) > 1
       AND SUM( (name IN ('зеленый', 'красный')) :: INT ) = 1
    Ответ написан
    1 комментарий
  • Как посчитать сколько раз повторяется значение обьекта?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    [value.language]: i
    Вы ничего не считаете, а записываете индекс элемента в массиве. Си у вас идёт в нулевом элементе, вот и получается 0.

    Решение очевидно
    Нужно поменять местами первый и второй элемент массива, тогда будет формироваться корректный объект. (нет)
    Ответ написан
    Комментировать
  • Возможно ли ускорить обмен данными между удаленным клиентом и сервером?

    @Drno
    Можно перейти на webdav протокол, он предназначен для передачи не по локалке

    проверить скорость связи между всеми узлами от клиента до smb сервера, может где то проблема со скоростью

    попробовать другой протокол впн, например zerotier или sstp
    Ответ написан
    Комментировать
  • Как корректно искать по регулярным выражениям в SQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Документацию полезно иногда читать.
    В ней шрифтом по фону написано, что
    To use a literal instance of a special character in a regular expression, precede it by two backslash (\) characters. The MySQL parser interprets one of the backslashes, and the regular expression library interprets the other.
    Ответ написан
    1 комментарий
  • Есть ли смысл перенести Mysql на другой сервер для ускорения сайта?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Нет, смысла нет. Для ускорения работы сайта надо сначала провести исследования проблемы. Для начала однозначно определиться что, где и как именно у вас "медленно открывается". Далее необходимо собрать данные о происходящих процессах - что, где, как и когда работает, а так же какую создает нагрузку на оборудование - процессор, память, сеть, диски и прочее. По результатам данного исследования надо будет найти бутылочное горлышко или несколько и исследовать их более детально и глубоко, чтобы понять как их устранить - программно, аппаратно, организационно и прочее. И вот только после этого уже решать что именно и как именно надо сделать для решения проблемы.
    Ответ написан
    Комментировать
  • Как сделать globbing строки в php?

    @rPman
    Ответ - регулярные выражения, синтаксис чуть сложнее чем * и ? но возможности выше
    preg_replace для однобайтовых кодировок или mb_ereg_replace для любых.

    регулярное выражение для твоей задачи будет выглядеть примерно так /word.*/ если после слова может присутствовать любое количество любых символов, включая нулевое (иначе использовать .+). Тут точка - это любой символ, а следующий за ним * или + - любое их количество

    upd. совсем забыл, preg_replace с модификатором /u понимает utf8 строки
    Ответ написан
    4 комментария
  • Как в идеале делается деплой среднего веб-приложения?

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

    Можно так:

    -- Создаём табличку
    CREATE TABLE IF NOT EXISTS employee (id int PRIMARY KEY, name text not null, salary int not null);
    
    -- Для примера две записи
    insert into employee (id, name, salary) values (1, 'Иван', 10000);
    insert into employee (id, name, salary) values (2, 'Пётр', 20000);
    
    -- Обновляем запись
    UPDATE employee set salary = 15000 WHERE id = 1;
    
    -- Обновляем запись с нашим условием - если переданное значение больше того что уже хранится, то вставляем его, иначе оставляем как было
    -- "переданное значение" тут =5000
    UPDATE employee SET salary = max(salary, 5000) WHERE id = 1;
    
    -- Ну и выбираем результат
    SELECT * from employee;


    В выводе будет:
    1 Иван 15000
    2 Пётр 20000


    Ну и ещё есть выражение CASE и функция IIF(condition, on_true, on_false).
    Ответ написан
    Комментировать
  • Почему не отправляются данные в базу данных?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
  • Почему ошибка при импортировании большой базы данных?

    @q2digger
    никого не трогаю, починяю примус
    он же пишет.
    Consider increasing innodb_buffer_pool_size.

    увеличивайте параметр innodb_buffer_pool_size
    Ответ написан
    Комментировать
  • Почему не могу закоммитить?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    первый раз работаю с git

    В первую очередь вам надо почитать учебник. Git это не та программа, с которой вы сходу можете начать работать. Он конечно простой, но вообще не интуитивно понятный.

    выдает 10000 файлов в каталоге

    Причина проста — вы инициализировали репозиторий находясь в корне вашего домашнего каталога. Нельзя так делать, если не хотите потерять свои файлы, бездумно вбивая команды типа stash.

    Что мне делать

    Удалить (или переименовать) подкаталог .git в котором хранится репозиторий. Затем создать его в правильном месте — в каталоге вашего проекта.
    Ответ написан
    Комментировать
  • Что сработает быстрее, что лучше использовать?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хороший вопрос, хотя и задавался миллион раз.

    Когда у вас выполняется запрос
    SELECT * FROM users WHERE DATE(created_at) = '2024-04-14'
    то СУБД должна пройти весь индекс до конца, получить каждое значение created_at, применить к нему функцию, сравнить с переданным значением, и добавить строку в результат запроса.

    Когда у вас выполняется запрос
    SELECT * FROM users WHERE created_at BETWEEN '2024-04-14 00:00:00' AND '2024-04-14 23:59:59'

    То СУБД находит бинарным поиском первое нужное значение, потом бежит по заранее отсортированному индексу и возвращает все значения до последнего, подходящего под второе условие.
    Ответ написан
    4 комментария
  • Как вставить данные сразу в 2 объединенные таблицы?

    @Akina
    Сетевой и системный админ, SQL-программист.
    в какой таблице будет храниться набор необходимых полей для вставки неизвестно

    Бред сивой кобылы (извиняюсь). Структура (точные имена полей, и в какой таблице какое поле) обязана быть заранее известна. Даже если используется псевдодинамическая структура на базе EAV или иным способом организованная.

    у меня есть 2 таблицы или допустим будет 3 ... Я хочу при выполнении insert into или update использовать эти таблицы

    MySQL не реализует одновременную вставку в более чем одну таблицу. А также не реализует использование запроса на вставку в CTE. Напрямую задача не решается.

    Правильная реализация - создание хранимой процедуры, которая принимает значения для всех параметров, и выполняет вставку нужных значений в таблицы последовательно выполняемыми запросами, при необходимости получая значения автоинкрементных полей из предыдущей вставки.

    Возможная (но нерекомендуемая) реализация - триггер на базовой таблице и передача параметров для подчинённых таблиц через определённые пользователем переменные.
    Ответ написан
    Комментировать
  • Что такое кластерный индекс в mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Кластерный индекс... это на самом деле понятие крайне виртуальное.

    Что такое обычный некластерный индекс? берём выражение индекса, считаем его значение для каждой записи, сортируем и пишем на диск. Получаем отдельную структуру, в которой выражение индекса сортировано. Когда потребуется искать заданное значение этого выражения, мы вместо просмотра от записи к записи сразу половинным делением быстренько найдём нужное значение, возьмём из него уникальный идентификатор записи, и обратимся за записью. Если в таблице 1000 записей, то для поиска заданного значения без индекса нам в среднем пришлось бы просмотреть 500 записей, а с индексом - всего 10.

    Теперь что такое кластерный индекс... сначала почти то же. Берём выражение индекса, считаем его значение для каждой записи, сортируем и... а вот теперь не записываем по порядку эти значения с номерами соответствующих записей в отдельную структуру, а сами записи располагаем в этом порядке. Теперь, когда потребуется искать заданное значение этого выражения, мы вместо просмотра от записи к записи, как это было, когда записи не сортированы, сразу половинным делением быстренько найдём нужное значение. Но нам уже не надо получать номер записи и обращаться за ней - мы нашли саму нужную запись.

    В MySQL (точнее, в используемом по умолчанию движке InnoDB) первичный индекс, во-первых, существует ВСЕГДА, во-вторых, определяется так (в статье, на которую дали ссылку, имеются неточности в пункте 2):
    1. Если первичный ключ задан явно, то его выражение является также и выражением кластерного индекса. Или иначе - первичный ключ и есть кластерный индекс.
    2. Если первичный ключ явно не задан, но в таблице имеется индекс, отвечающий всем следующим требованиям:
      • является уникальным
      • не является функциональным, в т.ч. не использует в выражении вычисляемые поля
      • не использует в выражении поля, которые определены как допускающие значение NULL

      то именно такой индекс используется в качестве первичного. А если таких индексов несколько, то используется первый по тексту запроса на создание таблицы
    3. Если не имеется ни того, ни другого - генерируется синтетический скрытый 6-байтовый номер записи, который и используется как первичный ключ. Следует отметить, что штатных способов доступа к этому значению не существует.


    Выглядит так, как будто это просто физическая сортировка данных по индексируемому полю.

    Фактически - именно так.

    Создаётся ли отдельная таблица или просто упорядочивается хранение существующих данных?

    Не создаётся. Но при изменении первичного индекса таблица полностью пересоздаётся с новым физическим порядком записей.

    Если данные упорядочиваются этим индексом, допустим по ID, то почему при select без сортировки данные могут возвращаться в произвольном порядке, а не отсортированные по ID по-умолчанию?

    Если не задан явно ORDER BY, сервер имеет право вернуть записи в любом порядке, как ему удобнее. В большинстве случаев, но не всегда, он будет возвращать записи в порядке чтения с диска...

    Представь такой (на самом деле невозможный, но не суть) случай - ты запросил таблицу. Вторая половина её ещё лежит в кэше, а первая уже выдавлена оттуда данными другой таблицы, нужными для выполнения запроса. Конечно, наиболее оптимальным будет начать передачу данных клиенту с этих записей, а пока они передаются, подчитать остальные, и передать их позже. Вот тебе порядок-то и поломался...

    ===

    PS. Кстати, правило выбора индекса, который будет использоваться в качестве кластерного, имеет неприятный побочный эффект. Если у некоторых полей, входящих в какие-то индексы, изменяется свойство NULLability, то это может привести к изменению того, какой из имеющихся индексов станет использоваться в качестве первичного по пункту 2. В результате мы получим невозможность использования INSTANT / INPLACE методов, и будет использован длинный COPY. Впрочем, ситуация такая крайне редка.
    Ответ написан
    2 комментария
  • Как правильно решить задачу?

    @Vitsliputsli
    select
        names.id,
        names.name,
        ages.age
    from names
    left join ages on names.id=ages.id and names.name='Андрей'
    Ответ написан
    Комментировать
  • Как сделать преобразование данных jsonb в таблицу с определенными полями?

    @alexalexes
    Как сделать так, чтобы из сохраняемого JSON создать новую таблицу

    Такой скрипт не должен создавать новые структуры в СУБД, он должен делать только вставки записей (insert-ы) в заранее подготовленные таблицы на этапе проектирования базы данных.

    id-question: "идентификатор_вопроса_с_указанием_типа"
    answer: "value":<ответ_на_вопрос>
    date: "created":"<дата_ответа>"

    Вот и создайте эту структуру ручками, create table вам в помощь.
    и далее объединить с таблицей, где будут поля

    Опять же, при вставке данных в базе не должно происходить модификации самой структуры базы.
    Вы при выборке данных сопоставляете данные из одной таблицы с другой таблицей при помощи внешних ключей.
    Запрос выборки будет иметь конструкцию join:
    select *
     from  Answer A
      join Question Q on Q.id_question = A.id_question -- как раз соединение по ключам
      ...

    В общем, учите мат. часть по реляционным СУБД.
    Ответ написан
    Комментировать
  • Зависит ли скорость записи в БД от количества в ней записей?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В общем случае не зависит
    В каждом конкретном случае, если вдруг будет зависеть, надо разбираться отдельно.
    Сам по себе вопрос - это одна из тех проблем, которыми не следует забивать себе голову заранее.
    Ответ написан
    Комментировать
  • Запрос mysql, как объединить сообщения в чаты?

    @alvi31182v
    GROUP BY GROUP_CONCAT для объединения сообщений в одну строку, упорядоченную по времени т.е если у тебя есть поле timestamp или msg_time если ты не хочешь использовать chat_id, то можно попробовать сделать следующий запрос

    GROUP BY chat_id - таким образом, строки с одинаковым chat_id будут объединены в одну группу

    "Функция LEAST выбирает минимальное из значений. Значениями могут выступать поля, а также строки и числа"
    "Функция GREATEST выбирает максимальное из значений / помогает упорядочивать пары пользователей"

    Комбинация LEAST и GREATEST гарантирует уникальность групировки чатов игнорируя порядок пар пользоваталей чатов.
    Вобщем есть набросок, дальше можно уже самому накидать и поиграться.
    $sql = "
        SELECT 
            MIN(from_user_id) as user1,
            MAX(from_user_id) as user2,
            chat_id,
            GROUP_CONCAT(msg ORDER BY msg_time) as messages
        FROM
            class_chat
        WHERE
            (from_user_id = :user1 AND to_user_id = :user2)
            OR
            (to_user_id = :user1 AND from_user_id = :user2)
            OR
            (from_user_id = :user3 AND to_user_id = :user4)
            OR
            (to_user_id = :user3 AND from_user_id = :user4)
        GROUP BY
            chat_id, LEAST(from_user_id, to_user_id), GREATEST(from_user_id, to_user_id)
    ";
    
    $stmt = $pdo->prepare($sql);
    
    $stmt->execute([
        ':user1' => 111, // тут айдишники пользаков
        ':user2' => 222,
        ':user3' => 333,
        ':user4' => 444,
    ]);
    
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        // Обработка результата
        echo "Chat ID: " . $row['chat_id'] . "\n";
        echo "User 1: " . $row['user1'] . "\n";
        echo "User 2: " . $row['user2'] . "\n";
        echo "Messages: " . $row['messages'] . "\n";
        echo "-----------------\n";
    }
    Ответ написан
    Комментировать
  • Как возвести в степень в php?

    @devian3000
    Ответ написан
    Комментировать
  • Как сделать запись в mysql с проверкой на уникальность с учётом времени из поля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Легко решается триггером. Пример:

    - исходная таблица:
    CREATE TABLE users (
      id INT AUTO_INCREMENT PRIMARY KEY,
      username VARCHAR(100),
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP
    );


    - триггер:

    CREATE TRIGGER tr_users_bi
    BEFORE INSERT ON users
    FOR EACH ROW
    BEGIN
      DECLARE allowed_created_at DATETIME;
      DECLARE error_message_text VARCHAR(64);
      SELECT MAX(created_at) + INTERVAL 12 HOUR INTO allowed_created_at
      FROM users
      WHERE username = NEW.username;
      IF NEW.created_at < allowed_created_at THEN
        SET error_message_text = CONCAT('Регистрация возможна не ранее ', allowed_created_at);
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = error_message_text; 
      END IF;
    END


    DEMO fiddle

    PS. Надеюсь, получение сгенерированного сообщения об ошибке и показ его юзеру не составит проблемы..
    Ответ написан
    Комментировать