Задать вопрос
Ответы пользователя по тегу SQL
  • Что не так с моим запросом?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT main.id,
           ( SELECT COUNT(*) 
             FROM news 
             WHERE main.id = news.main_id ) news,
           ( SELECT COUNT(*) 
             FROM articles
             WHERE main.id = articles.main_id ) articles
    FROM main
    ORDER BY news DESC;


    Предполагается, что main(id) есть уникальное поле (скорее всего первичный ключ).
    Ответ написан
    2 комментария
  • Как удалить дубликаты Oracle SQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Вывод дубликатов:
    SELECT t1.*
    FROM table t1
    WHERE EXISTS ( SELECT NULL
                   FROM table t2
                   WHERE t1.id <> t2.id -- выражение первичного ключа
                     AND t1.column = t2.column -- для всех полей, кроме первичного ключа


    Удаление:
    DELETE 
    FROM table t1
    WHERE EXISTS ( SELECT NULL
                   FROM table t2
                   WHERE t1.id > t2.id -- оставить только запись с минимальным ID
                     AND t1.column = t2.column
    Ответ написан
  • Как подсчитать кол-во записей нескольких столбцов?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT value,
           SUM(value = val1) total_1,
           SUM(value = val2) total_2
    FROM ( SELECT val1 value FROM test
           UNION 
           SELECT val2 FROM test ) total
    CROSS JOIN test
    GROUP BY value
    ORDER BY value;

    DEMO

    Само собой если некоего значения нет ни в одном из полей, его не будет и в результате.
    Ответ написан
    Комментировать
  • Почему value="" записывает пустоту, а не NULL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    NULL и пустая строка есть две совершенно разные вещи (исключение - Оракл). NULL - это отсутствие любого, в том числе пустого, значения.
    Ответ написан
    Комментировать
  • Как можно сделать чтобы из друх таблиц информация объединялась в одну?

    @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 (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 комментария
  • Ошибка SQL HASMGR?

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

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

    ---

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

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

    ---

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

    @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;
    Ответ написан
    Комментировать
  • Как создать правильно уточняющий запрос?

    @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}


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

    @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 комментариев
  • Как исключить из выборки, группу записей с одним 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 комментария
  • Как удалить строку из 2-х таблиц одним запросом?

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

    Полагаете, что запись с указанным ID существует.

    Если в table_1 такой записи нет - никаких удалений не будет, даже если во второй таблице есть такие записи.

    В общем случае для решения задачи одним запросом необходим FULL JOIN. Но увы, MySQL его не поддерживает. А потому в общем случае задача нерешаема.
    Ответ написан
    Комментировать
  • Как задать триггер менять значение в поле при изменении в другом поле?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE TRIGGER tr
    ON routes
    AFTER INSERT 
    AS 
    UPDATE [user]
    SET [update] = 1
    FROM INSERTED
    WHERE id = INSERTED.user_id;

    fiddle
    Ответ написан
    2 комментария
  • Как собирать статистику по разным промежуткам времени?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Используйте условное агрегирование.
    SELECT `id_user`, 
           SUM(`sum`) `sum_month`, 
           SUM(`sum` * (`date` >= NOW() - INTERVAL 1 WEEK)) `sum_week`, 
           SUM(`sum` * (`date` >= NOW() - INTERVAL 1 DAY)) `sum_day`, 
           users.name 
    FROM `balance_history` 
    INNER JOIN `users` ON `id_user` = users.id 
    WHERE `date` >= NOW() - INTERVAL 1 MONTH
      AND `type` = 'plus' 
    GROUP BY `id_user`, users.name 
    ORDER BY `sum` DESC


    Выражения-аргументы SUM() - это упрощённое выражение типа

    SUM(CASE WHEN {some condition}
             THEN {some value}
             ELSE 0
             END)


    Ну а WHERE ещё и позволяет не трясти более древние записи, которые заведомо не учитываются ни в одной из сумм. Поэтому оно отбирает самый длительный из периодов суммирования, а заодно избавляет от условия агрегирования одно из выражений.
    Ответ написан
    Комментировать