Задать вопрос
  • Как можно сделать чтобы из друх таблиц информация объединялась в одну?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Удалить таблицу main - за полной её ненадобностью и бессмысленностью. Вместо неё создать представление на основе остальных двух таблиц,
    Ответ написан
    Комментировать
  • Как правильно сделать запрос в бд?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *
    FROM chat
    WHERE NOT EXISTS ( SELECT NULL
                       FROM group_chat 
                       WHERE chat.id = chat_id
                         AND group_id = 9 )

    Кстати, заменив NOT EXISTS на EXISTS, можно получить тот же результат, что и в запросе из текста вопроса. При правильном индексировании он будет, скорее всего, даже более эффективен.
    Ответ написан
  • Как в таблицу SQL добавить столбец с аналогичной второй таблицы?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В простом варианте:

    SELECT 500 queue, operator, os.avg_os, ss.avg_ss
    FROM ( SELECT operator,AVG(valuation) avg_os
           FROM oper_survey 
           WHERE queue = '500' AND `date` BETWEEN '2021-06-01' AND '2021-06-16' 
           GROUP BY operator ) os
    JOIN ( SELECT operator, AVG(valuation) avg_ss
           FROM service_survey 
           WHERE queue = '500' AND `date` BETWEEN '2021-06-01' AND '2021-06-16' 
           GROUP BY operator ) ss USING (operator)


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

    SELECT 500 queue, operator, COALESCE(os.avg_os, 0) avg_os, COALESCE(ss.avg_ss, 0) avg_ss
    FROM ( SELECT operator FROM oper_survey WHERE queue = '500'
           UNION 
           SELECT operator FROM service_survey WHERE queue = '500' ) op
    LEFT JOIN ( SELECT operator,AVG(valuation) avg_os
                FROM oper_survey 
                WHERE queue = '500' AND `date` BETWEEN '2021-06-01' AND '2021-06-16' 
                GROUP BY operator ) os USING (operator)
    LEFT JOIN ( SELECT operator, AVG(valuation) avg_ss
                FROM service_survey 
                WHERE queue = '500' AND `date` BETWEEN '2021-06-01' AND '2021-06-16' 
                GROUP BY operator ) ss USING (operator)
    Ответ написан
    Комментировать
  • Как выполнить подзапрос в SQL (SELECT с передачей параметра из основного запроса?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT users.name AS username,
           count(orders.id) AS orders_count 
    FROM users
    JOIN orders ON orders.user_id=users.id
    GROUP BY users.name

    Если нужно вывести и пользователей, у которых нет заказов, с нулевым количеством, то использовать LEFT JOIN.

    PS. Запрос из текста вопроса тоже корректен и должен дать правильный результат. Причём с 50% вероятностью он будет преобразован в мой (точнее, оба дадут один и тот же план выполнения). Остальные 50% - на то, что он будет выполнен итерационно (и тогда скорее всего просто будет выполняться дольше).
    Ответ написан
    2 комментария
  • Репликация MySQL 8?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Правильно ли понимаю, что в случае отказа слейва на какое-то условное кол-во времени за которое mysql-bin.log заротейтится при достижении условных 100М, то при восстановлении слейв сервера, данные, которые находятся уже в архивном логе не будут записаны?


    Нет, неправильно.

    max_binlog_size устанавливает размер ОДНОГО файла лога. Когда указанный размер достигнут, создаётся новый, и запись идёт уже в него. А старый никуда не девается, и будет нормально передан на слейв, когда его функционирование восстановится.
    Ответ написан
  • Ошибка SQL HASMGR?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Таблица, на которую ссылается внешний ключ, должна существовать на момент создания ключа (т.е. должна быть создана ранее).

    То есть надо бы изменить порядок создания таблиц. Сначала создать SALEREPS, и только потом OFFICES...

    ---

    Но вообще структура какая-то бредовая. Одна таблица имеет FK на другую, которая имеет FK на первую... как-то логики совсем не прослеживается.

    И просто пересортировкой порядка создания таблиц такое не лечится. Сначала все таблицы, потом все внешние ключи - единственное решение... но сперва надо разобраться с логикой зависимостей таблиц.

    ---

    И это... всегда указывайте точно поле, на которое должен ссылаться внешний ключ. Не надейтесь на умолчания.
    Ответ написан
    Комментировать
  • Как можно увеличить скорость запроса?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT TOP 500 * 
    FROM [table] 
    WHERE  NOT EXISTS ( SELECT NULL 
                        FROM [Entities] 
                        WHERE [column] = '2' 
                          AND [table1].[Id] = [ClientTableId] )


    PS. Наличие индекса Entities (column, ClientTableId) - приветствуется. Впрочем, может, Entities (ClientTableId, column) окажется лучше - зависит от статистики данных.

    PPS. TOP 500 без указания ORDER BY есть штука малоосмысленная.
    Ответ написан
    2 комментария
  • Есть ли способ автоматически добавить все пустые строки в MySQL с AUTO_INCREMENT до какого-то максимального значения?

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

    WITH RECURSIVE 
    cte AS ( SELECT 1 n
             UNION ALL
             SELECT n + 1  FROM cte WHERE n < 1000 )
    INSERT INTO tablename (id)
    SELECT NULL FROM cte t1 CROSS JOIN cte t2;
    Ответ написан
    Комментировать
  • Как восстановить файл после удаления из корзины?

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

    С рабочего стола в корзину, а потом из корзины?

    Выключить компьютер (лучше - жёстко, прям дёрнув кабель питания, ибо система авось не сдохнет, а вот каждая секунда работы уменьшает вероятность успешного восстановления). Загрузиться с LiveCD/DVD/flash. Затем

    1) запустить сканер удалённых файлов (рекомендую Recuva) от имени SYSTEM (через ps.exe) и смотреть удалённые файлы в папке корзины.

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

    Если не помогло, то

    2) запустить сканер с прямым доступом к диску (рекомендую DMDE) и искать по известному содержимому файла (подстрока 10-20 символов, но более-менее оригинальная) в неиспользуемом пространстве диска либо вообще по всему диску. найденные куски (их скорее всего будет много) копировать, и потом из них воссоздать файл (впрочем, есть шанс, что найдётся текст из файла целиком).
    Ответ написан
    Комментировать
  • SQL-запрос: как выбрать тех, у кого авторизация ТОЛЬКО из приложения?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT DISTINCT user_id
    FROM enter t1
    WHERE NOT EXISTS ( SELECT NULL
                       FROM enter t2
                       WHERE enter_source = 'web' 
                         AND t1.user_id = t2.user_id )
      AND EXISTS ( SELECT NULL
                   FROM enter t3
                   WHERE enter_source IN ('ios', 'android')
                     AND t1.user_id = t3.user_id );
    Ответ написан
    Комментировать
  • LEFT JOIN по условию IF?

    @Akina
    Сетевой и системный админ, SQL-программист.
    DROP PROCEDURE IF EXISTS get_artist;
    DELIMITER ;;
    CREATE PROCEDURE get_artist(IN artist_id integer(11), IN show_links integer(1))
    BEGIN
        CASE WHEN show_links=1
             THEN 
                 SELECT * 
                 FROM artist 
                 where id = artist_id;
             ELSE  
                 SELECT * 
                 FROM artist 
                 LEFT JOIN artist_social_links ON artist_social_links.artist_id = artist_id 
                 where id = artist_id ;
        END CASE;
    END;;
    DELIMITER ;
    CALL get_artist(196796, 1);
    Ответ написан
    3 комментария
  • Как обновить menu_order порядок в WP у всех дочерних записей, при изменении порядка одной из них?

    @Akina
    Сетевой и системный админ, SQL-программист.
    На чистом SQL задача решается несложным запросом.

    Пример.

    Исходная структура:
    CREATE TABLE test (entity INT,    -- некая строка в структуре
                       position INT); -- её позиция при сортировке


    Исходные данные для изменения:

    @from - номер позиции элемента, который надо куда-то переместить;
    @to - номер позиции, на которую его надо переместить.

    Запрос:
    UPDATE test
    SET position := CASE WHEN position = @from 
                         THEN @to
                         ELSE position + SIGN(@from - @to)
                         END
    WHERE position BETWEEN LEAST(@from, @to) AND GREATEST(@from, @to);


    DEMO fiddle.
    Ответ написан
    4 комментария
  • Почему ошибка появилась и как ее исправить?

    @Akina
    Сетевой и системный админ, SQL-программист.
    в чем именно проблема со словом Автомобиль мне непонятно.
    Имена объектов должны соответствовать тому, что о них написано в документации. И скорее всего там НЕ указано, что кириллица и прочие символы не-А разрешены.
    Ответ написан
  • Почему подсети, подключенные к одному маршрутизатору, пингуются между собой?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Потому что

    1) На Основном роутере включена маршрутизация
    2) На компьютерах отделов правильно настроен шлюз в подсети других отделов.
    Ответ написан
    Комментировать
  • Можно ли совместить два запроса с группировкой?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT priority,
           SUM(time >= '2021-06-04' AND time < '2021-06-05') AS today,
           SUM(time >= '2021-06-03' AND time < '2021-06-04') AS yesterday
    FROM  tableX
    WHERE time >= '2021-06-03' AND time <= '2021-06-05'
    GROUP BY priority
    Ответ написан
    1 комментарий
  • Как удалить дубли строк в MySQL в таблице, связанной с другими?

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

    Дерьмо. Забудь.

    Есть большая БД на 50гб, и стоит задача удалить дубли в одной из таблиц.
    [skipped]
    Но проблема в том что в других таблицах есть связи через внешние ключи с моей основной.


    Порядок действий.

    Запрос 0. Выполнить полное резервное копирование. Убедиться, что полученный бэкап валиден.

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

    Запрос 2. Удалить все записи-дубликаты, кроме имеющих минимальное (или максимальное) значение первичного индекса.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Объясните мне почему программист должен гуглить на английском?

    Ну формально он никому ничего не должен.

    Основная причина, почему я гуглю на аглицком, в том, что 90% документации - именно на аглицком. И да, я именно гуглю, ибо яндекс в вопросах поиска технических текстов если и не полное г., то в общем как-то чересчур гуманитарен.

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

    Так что, вводя фразу на ихнем, а если где-то уверен, то и обрамив двойными кавычками, я гораздо быстрее найду нужное.
    Ответ написан
    1 комментарий
  • Как сформировать БД для запуска команд по расписанию?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE TABLE schedule ( schedule_id INT PRIMARY KEY,
                            start_time TIME,
                            task_id INT );

    В одной записи - одно время и одна задача. Никаких CSV-наборов.
    Если у задач есть отдельная таблица - то соответственно FOREIGN KEY в неё.
    Ответ написан
    1 комментарий
  • Как получить количество по каждому состоянию для товара?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ну обычная условная агрегация же!

    SELECT name,
           SUM((state=1)*amount) total_state_1,
           SUM((state=2)*amount) total_state_2,
           SUM((state=3)*amount) total_state_3
    FROM tablename
    GROUP BY name;
    Ответ написан
    Комментировать
  • Как найти таблицу в нужной схеме MySQL?

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

    Получите соответствующее сообщение об ошибке.

    дошёл до такой функции

    Сотрите срочно. Существование таблицы (вообще или в определённой схеме) проверяется запросом в INFORMATION_SCHEMA.TABLES.

    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    -- WHERE TABLE_NAME = 'my_table_name'
    ;


    что если в другой схеме уже есть таблица с таким названием...

    Ну допустим есть, и что?
    Ответ написан
    Комментировать