• 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'
    ;


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

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

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

    SELECT product.id
    FROM product
    INNER JOIN product_property
    INNER JOIN property
    WHERE property.value IN ( {values list} )
    GROUP BY product.id
    HAVING COUNT(DISTINCT property.value) = {distinct values count}


    Условия связывания и дополнительные ограничения допишете самостоятельно.
    Ответ написан
  • Как понять тип объекта в IndexColumns?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT * FROM sys.types
    Ответ написан
    Комментировать
  • Как импортировать большой JSON (18гб) в MySQL?

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

    Оптимальный - положить этот файл туда, куда может дотянуться MySQL. Импортировать, используя LOAD DATA INFILE, во временную таблицу. Несложным запросом распарсить в рабочие таблицы (как я понимаю, хоть весь файл и невалиден как JSON, но каждая отдельная строка файла есть JSON валидный). И прибить временную таблицу.

    На всё про всё три запроса. Если очень хочется, можно их выполнить и через php, конечно. Но я бы затолкал их в хранимую процедуру (особенно если задача импорта обновлённых данных будет регулярная) и вызывал её - тогда вообще один запрос CALL proc_name;.

    А можно и в один запрос уложиться, если использовать LOAD DATA INFILE с препроцессингом. Тогда и валидность JSON на строку неважна =- лишь бы формат данных в строке не плавал от одной строки к другой.

    А гонять 18 гектар с диска в PHP, а потом от PHP к MySQL - ну несерьёзно.

    PS. Загрузка с использованием LOAD DATA INFILE весьма нетребовательна к объёму оперативной памяти. И неважно, какого размера исходный файл.
    Ответ написан
    Комментировать
  • Конвертация типа и условие?

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

    SELECT *
    FROM email
    WHEN public.email.campaign_id IS NULL


    ?

    Ну или если вдруг вот офигеть как нужна эта дополнительная колонка, то

    SELECT *, 'false' AS campaign_id_bool
    FROM email
    WHEN public.email.campaign_id IS NULL


    нужно, чтоб были значения и тру и фолс в зависимости от того пустое ли поле


    SELECT *, 
           CASE WHEN public.email.campaign_id IS NULL
                THEN 'false' 
                ELSE 'true' 
                END AS campaign_id_bool
    FROM email

    Или так:
    SELECT *, 
           ELT(1 + public.email.campaign_id IS NULL, 'true', 'false' ) AS campaign_id_bool
    FROM email
    Ответ написан
    6 комментариев
  • Как задать переменную а потом использовать ее в запросе в Postgres?

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

    Типа (игнорируя синтаксис, только принцип):
    WITH
    some_data AS ( SELECT ARRAY(1,2,3) AS some_value )
    SELECT * 
    FROM some_table
    CROSS JOIN some_data
    WHERE some_table.some_field NOT IN some_data.some_value


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

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT a.login
    FROM account a
    JOIN transactions t ON a.id = t.account_id
    JOIN game g ON t.game_id = g.id
    JOIN company c ON c.id = g.Developer
    GROUP BY a.login
    HAVING !SUM( c.country != 'USA' OR YEAR(g.Release_date) MOD 2 )


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

    Как работает?

    Если в данной совокупной записи страна - штаты, то c.country != 'USA' есть FALSE, что в числовом контексте есть ноль, а иначе TRUE и соответственно единица.

    Если в данной совокупной записи год чётный, то YEAR(g.Release_date) MOD 2 есть ноль, а иначе единица.

    Итого в скобках получаем единицу, если хотя бы одно из условий TRUE.

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

    Ну и затем инвертируем (восклицательный знак - это оператор NOT). Соответственно если сумма ненулевая, получаем после инверсии ноль, который интерпретируется как FALSE, а если нулевая, то после инверсии получаем единицу, которая TRUE.
    Ответ написан
    3 комментария
  • Как собрать данные в одну таблицу из двух?

    @Akina
    Сетевой и системный админ, SQL-программист.
    мне надо чтоб по артикулу, он определил product_id из другой таблицы и заменил related_sku ( артикул в даный момент) на product_id из другой таблицы.

    Нехорошая идея - портить данные. причём так, что ни повторить, ни откатиться. Куда как лучше создать третье поле
    ALTER TABLE related_products ADD COLUMN related_id INT;

    и уже в него добавить соотв. значения
    UPDATE related_products p
    JOIN another_table a ON p.related_sku = a.sku
    SET p.related_id = a.product_id
    WHERE p.related_id IS NULL

    WHERE нужен на случай повторных запусков второго запроса - вдруг не все соответствия будут получены из-за опечаток, различного написания и пр.
    Ответ написан
    Комментировать
  • Как вывести строчку в mysql workbench?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В MySQL в выходной поток может писАть только запрос SELECT. Без вариантов. Формально - также это могут делать встроенные макросы (например, SHOW) - но всё равно все они есть спрятанный в недрах кода SELECT.

    Триггер выполняется в рамках выполнения запроса INSERT/UPDATE/DELETE, т.е. запроса, для которого запись в выходной поток не разрешена. Соответственно из триггера никакую строку никуда вывести нельзя.
    Ответ написан
    2 комментария
  • Почему сломались отчеты после миграции 1С с mssql на postgresql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SQL Server и PostgreSQL - две разные СУБД. И соответственно два разных диалекта (да, много общего, но и различий хватает). Запросы, работающие на одной СУБД, запросто могут поломаться при выполнении в другой СУБД - как совсем, до неисполнения и ошибки, так и частично, давая неверные результаты. Причём что-то легко адаптируется, а что-то не адаптируется вообще никак, требуя полного переписывания с нуля.
    Ответ написан