• Как осуществить поиск (like) по полю в массиве в json колонке?

    @alexalexes
    Сделать нормализацию структуры базы.
    Перенести JSON в таблицу user_phone.
    Поля:
    phone_id, -- первичный ключ телефона
    user_id, -- внешний ключ, кому относится телефон
    phone, -- телефон
    phone_comment, -- комментарий к телефону
    -- еще поля по вкусу, но иногда выручающие
    is_main, -- основной не основной/порядок приоритета
    add_date -- дата внесения телефона
    И в запросах уже нормально джойнить и лайкать эту таблицу.
    PS:
    В качестве временного костыля (ни в коем случае не оставлять на постоянной основе!):
    SELECT Users.*,
           ph.value->>'phone' as phone
    FROM Users, json_array_elements(Users.phones) as ph
    where ph.value->>'phone'   like '7%3';
    Ответ написан
    3 комментария
  • Как подсчитать и вывести количество совпадений значения в строке при запросе в MySQL?

    @alexalexes
    Если у вас MySQL 8, то дубликаты телефонов можно найти тривиально:
    select A.*
      from (SELECT `date`, `name`, phone, count() over (partition by phone) phone_count
            FROM `myusers`
    ) A
    where A.phone_count > 1
    ORDER BY date ASC

    Если MySQL 5, то придется немного по сложнее:
    select `date`, `name`, phone, p.phone_count
    from `myusers` as mu
    join (SELECT phone, count(*) phone_count
             FROM `myusers`
             group by phone) p on p.phone = mu.phone
    where p.phone_count > 1
    ORDER BY mu.date ASC
    Ответ написан
    4 комментария
  • Как правильно создать триггер?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    У вас все поля в пределах одной таблицы. Почему не вычисляемое поле?

    Как указал Akina использовать NOW() нельзя, но с учётом того, что срабатывание триггера выполняется только один раз, в момент на которое указывает поле modified можно использовать его. Также приведя условия статуса к верной логике получаем (MySQL online):
    -- create
    CREATE TABLE airdrops (
        start_date datetime NOT NULL,
        end_date datetime NOT NULL,
        modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        status int(11) AS ( case
                              when modified < start_date THEN 0
                              when modified >= start_date AND modified <= end_date THEN 1
                              when modified > end_date THEN 2
                              else -1
                            end )
        );
    -- insert
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-12', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-01', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-02', '2024-03-09') ;
    -- fetch 
    SELECT * FROM airdrops;


    статус 2 устанавливался автоматически если текущая дата
    Использовать представление (MySQL online)
    -- create
    CREATE TABLE airdrops (
        start_date datetime NOT NULL,
        end_date datetime NOT NULL
        );
    -- insert
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-12', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-01', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-02', '2024-03-09') ;
    -- view
    CREATE VIEW airdrops_status
    AS
    SELECT start_date, end_date,
          case
            when NOW() < start_date THEN 0
            when NOW() >= start_date AND NOW() <= end_date THEN 1
            when NOW() > end_date THEN 2
            else -1
          end AS status
      FROM airdrops;
    -- fetch 
    SELECT * FROM airdrops_status;
    Ответ написан
    6 комментариев
  • Как в PhpMyAdmin посмотреть историю изменения названия полей таблицы?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Никак, если вы сами её не сохраняли. MySQL таких логов не ведёт.
    Ответ написан
    2 комментария
  • Visual Basic или Python для Excel?

    altprtcl
    @altprtcl
    Python - разработчик
    Макросы, кнопки, формы?
    Только VBA. Насколько знаю, Microsoft на данный момент не предлагает никаких иных язык программирования для взаимодействия непосредственно в самом Excel

    Аналитика или обработка данных а - ля Data Science?
    Шагайте в сторону Python, тут есть куда расти, он намного понятнее и даёт больше контроля. Про огромное количество инструментов на все случаи жизни даже не зарекаюсь, чего только библиотеки pandas и numpy стоят?

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

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

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Имена полей подставлять нельзя.
    Ответ написан
  • Как удалить запись в таблице MySQL по трём параметрам?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы правильно удалить запись в таблице по трём параметрам, надо указать все три параметра в условии WHERE
    DELETE FROM table_name WHERE col_1=val_1 AND col_2=val_2 AND col_3=val_3


    Не два, не пять, не десять, а ровно три параметра.
    Ответ написан
    Комментировать
  • Как проходит трафик в локальной сети через неуправляемые свитчи?

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

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Даты в БД хранишь в формате UTC. Можно даже без таймзон. Главное, чтобы все представляли единый формат/точку отчета.

    На клиенты отправляешь эту дату. JS может создавать Date используя ISO формат - клиент эту дату парсит и используя свою временную зону парсит.

    В общем, смысл следующий:
    - В БД даты хранятся относительно UTC
    - На и с клиента даты отправляются в UTC формате - представление даты с учетом таймзоны будет на стороне пользователя/UI, а коде бизнес-логики работа ведется с UTC

    Клиент лучше знает, какая у него таймзона и локаль
    Ответ написан
    2 комментария
  • Как получить данные из строки mysqli?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы получить одну строку из результата запроса, в mysqli есть функции
    • fetch_assoc(): возвращает всю строку в ассоциативный массив
    • fetch_row(): возвращает нумерованный массив (список)
    • fetch_obj(): возвращает объект класса stdClass
    • fetch_column(): возвращает значение из первой колонки запрошенной строки

    В общем случае случае осмысленный код для получения значения единственной колонки будет таким
    $sql = "SELECT link FROM tablet where id=?";
    $result = $conn->execute_query($sql, [$a]); 
    $link = $result->fetch_column();

    Но как правильно замечено в комментариях, правильнее будет рандомизировать сразу в запросе, причем все делать одним запросом, а не тремя
    function Axelmo($conn) {
        $sql2 = "SELECT link FROM tablet ORDER BY rand() LIMIT 1";
        return $conn->query($sql)->fetch_column();
    }

    Ну и чисто для иллюстрации, как сделать запрос с ограничением по id
    function Axelmo($min, $max, $conn) {
        $sql2 = "SELECT link FROM tablet where id >= ? AND id <= ? ORDER BY rand() LIMIT 1";
        return $conn->execute_query($sql, [$min, $max])->fetch_column();
    }
    Ответ написан
    1 комментарий
  • Можно ли корректно заполнить создаваемое поле таблицы данными из другой таблицы?

    Adamos
    @Adamos
    UPDATE TableA LEFT JOIN (
    SELECT MIN(Id) AS id, Name FROM TableB GROUP BY Name
    ) AS b
    ON TableA.Name = b.Name
    SET TableA.TableBId = b.id

    Соотвественно, до этого запроса - ALTER TABLE с добавлением столбца TableBId, после - ALTER TABLE с удалением Name.
    Можно сделать "ногой в дверь", записывая значение прямо в Name и потом ALTER TABLE его с переименованием и сменой типа, но я бы не рисковал ;)
    Ответ написан
    3 комментария
  • Зависит ли скорость записи в БД от количества в ней записей?

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

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    В дальнейшем это повысит нагрузку на бд при поиске записей.
    Когда записей будет под миллион, запустите 1 раз удаление старых неактивированных аккаунтов и выиграете еще аж 500 (а может даже 5тыщь!) записей, это сильно поможет...
    Ответ написан
    Комментировать
  • Как сгруппировать по двум полям?

    @alexalexes
    SELECT TOP (100)   
    [error_number] ,
    [error_desc],
    COUNT([error_number])as total      
    FROM Db.tab_error
    group by error_number, error_desc

    Добавить и в select, и в group by.
    Группировка не распадется, если у всех одинаковых error_number строго одно и тоже содержание error_desc.
    Если error_desc не обладает таким свойством, то придется использовать оконную функцию:
    SELECT TOP (100)   
    [error_number] ,
    [error_desc],
    COUNT(*) over (partition by [error_number]) as total      
    FROM Db.tab_error
    Ответ написан
    1 комментарий
  • Как по ВПН соединить две сети с одинаковым поддиапазоном 192.168.0.1/24?

    @asmelnik
    Классика говорит, что НЕТ!
    Сети НЕ ДОЛЖНЫ ПЕРЕСЕКАТЬСЯ!

    "Костыли" при определенных условиях возможны, вроде proxy arp, проброса портов и.т.д.
    Но они имеют свои ограничения и условия применимости.

    Самое правильное одну из сетей перекинуть в другой диапазон, например
    192.168.1-255.0/24
    Если так уж принципиально 192.168.0.xxx
    Можно одну сеть сделать
    192.168.0.0/25 (адреса 1-126)
    вторую
    192.168.0.128/25 (адреса 129-254)
    Если в каждой сети менее 120-ти хостов,
    и маршруты 192.168.0.0/24 указать в VPN.

    Учитывая отсутствие возможности изменения второй сети и жесткое условие сохранения адрессации -- нормального решения НЕТ!
    Узел 192.168.0.12 в сети 1 НИКОГДА не сможет связаться (по IP) с узлом 192.168.0.12 в другой сети.
    Вот СОВСЕМ!
    (Проброс портов не считаем, это несколько иное условие).
    Ответ написан
    8 комментариев
  • Датаграмма UDP может прийти в неверном порядке. Как это?

    hint000
    @hint000
    у админа три руки
    То есть я могу отправить:
    012345
    А получить:
    253401
    Во-первых, если важно получить 012345, то надо посылать в одной датаграмме 012345, а не в шести отдельно по одному символу.
    Во-вторых, даже если отправлять по одному символу, то вероятность получить 253401 очень мала.
    Скорее вы можете получить 02345 или 01345 или 135, т.е. простую потерю пакетов. Неверный порядок возможен, но в реальной жизни будет редко встречаться (он может быть вызван повторной отправкой кадров, т.е. проблемами на более низком уровне OSI, тогда первая датаграмма может задержаться из-за переотправки кадров, из которых она состоит, а вторая датаграмма может пройти без ошибок в кадрах и оказаться у получателя раньше первой; а ещё они могут пойти разными маршрутами с разной задержкой, но это уже экзотика).
    Ответ написан
    2 комментария
  • Как выполнить копирование базы данных внутри исходного сервера?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Перевести базу данных в автономный режим. Скопировать её файлы. Присоединить их как новую базу данных.
    Через SSMS не получится присоединение с изменением имени, поэтому используйте скрипт:
    USE [master]
    GO
    CREATE DATABASE [Testus_copy] ON 
    ( FILENAME = N'C:\MSSQL\Testus_copy.mdf' ),
    ( FILENAME = N'C:\MSSQL\Testus_copy.ldf' )
     FOR ATTACH
    GO
    Ответ написан
    3 комментария