Задать вопрос
  • Можно ли написать sql запрос на вывода последнего элемента?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT DISTINCT
           FIRST_VALUE(column_1) OVER (ORDER BY column_1 IS NULL, id DESC) column_1,
           FIRST_VALUE(column_2) OVER (ORDER BY column_2 IS NULL, id DESC) column_2
    FROM test;

    Если в "пустых" полях не NULL, а пустые строки, то соответственно
    SELECT DISTINCT
           FIRST_VALUE(column_1) OVER (ORDER BY column_1 = ' ', id DESC) column_1,
           FIRST_VALUE(column_2) OVER (ORDER BY column_2 = ' ', id DESC) column_2
    FROM test;

    fiddle

    Требуется MySQL версии 8+.
    Ответ написан
    Комментировать
  • Позволяют ли партишены делать такое?

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

    Нет, динамические границы раздела - такое в принципе невозможно.

    В документации показаны примеры. Когда создается базовая таблица table_base и дальше от нее создаются партишены
    Не лезьте в высокие материи, не зная основ. Начните с самого обычного RANGE PARTITIONING. Одна таблица - куча разделов, и никаких надтаблиц.
    Ответ написан
  • Как удалить строку из 2-х таблиц одним запросом?

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

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

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

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    255.255.255.255 - бродкаст сети 0.0.0.0/0. Т.е. глобальный бродкаст.

    Именно поэтому он присутствует для каждого локального адреса. При поступившем в IP-стек запросе на отправление пакета на адрес глобального бродкаста от какого-либо приложения он будет отправлен через каждый имеющийся логический интерфейс (локальный IP-адрес). Аналогично он будет принят с любого интерфейса и обработан системой.
    Ответ написан
    Комментировать
  • Как проверить матрицу смежности неориентированного графа на верность?

    @Akina
    Сетевой и системный админ, SQL-программист.
    rastr, как понимать Ваше
    написать не выходит
    , если Вы тут же приводите код - который, кстати, способен решить задачу. Ну разве что:
    1. Итерация идёт по отдельному столбцу либо строке - так что ставить верхнюю границу для i по всей матрице несколько неправильно
    2. По i надо итерировать до предпоследнего значения, а по j - от значения на 1 больше текущего i до последнего. Ибо если проверена какая-то пара, то нет смысла проверять её ещё раз "с обратной стороны", а уж равенство элемента самому себе так и вовсе проверять бессмысленно.

    В общем, приблизительно так (без точного соблюдения синтаксиса)
    bool is_adjacency_matrix_correct(const vector<string>& matrix) {
      size=matrix[0].size();
      for (auto i = 0; i < size-1; i++) {
        for (auto j = i+1; j < size; j++) {
          if (matrix[i][j] != matrix[j][i])
            return false;
        }
      }
      return true;
    }
    Ответ написан
    Комментировать
  • Как исправить ошибку индекса PRIMARY базы данных mysql bitrix24?

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

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

    Факт 2

    Я перенёс портал из облака в коробку


    Итого

    Факты свидетельствуют о том, что перенос был выполнен некорректно. Для исправления - удалите поле id, а затем создайте первичный индекс с указанными тремя полями.

    Для проверки - предварительно подключитесь к старой версии таблицы и проверьте, действительно ли в ней отсутствует автоинкрементное поле по фамилии id. А в качестве совсем бреда - сравните, какая СУБД (включая точную версию) на старом и на новом месте.
    Ответ написан
    Комментировать
  • PostgreSQL: как дождаться ввода пароля при запуске скрипта?

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

    @echo off
    cls
    SET /P psqlpassword="Введите пароль (Enter для завершения): "
    if "%psqlpassword%"=="" exit /b
    "C:\Program Files\PostgreSQL\13\bin\psql.exe" -U postgres -W %psqlpassword% -f  D:/script.sql -a 
    pause


    Если пароль введён неверно, будет отображено сообщение об ошибке, и выполнение пойдёт дальше.

    Если надо заново запросить пароль, следует использовать проверку на ошибку:

    @echo off
    :execute_psql
    cls
    SET /P psqlpassword="Введите пароль (Enter для завершения): "
    if "%psqlpassword%"=="" exit /b
    "C:\Program Files\PostgreSQL\13\bin\psql.exe" -U postgres -W %psqlpassword% -f  D:/script.sql -a 
    if errorlevel 1 goto :execute_psql
    pause


    Правда, нужно убедиться, что psql.exe её возвращает, что не факт. Также следует убедиться, что он не возвращает ошибки в иных ситуациях, когда повторный запрос пароля и запуск не требуются, или ввести проверку на код ошибки.
    Ответ написан
  • Ошибка в mysql таблица не может быть создана в зарезервированном табличном пространстве mysql?

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

    Если Вы хотите создать копию таблицы, делайте импорт в рабочую/временную базу данных. При этом убедитесь, что в дампе нет указания создавать таблицу именно в базе mysql (или явно отключите это при создании дампа).
    Ответ написан
    1 комментарий
  • Скорость загрузки не соответствует скорости интернета?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Но мы знаем что 1Мбайт/с = 8Мбит/с.

    Вы неправильно знаете. Для загрузки со скоростью 1 мегабайт в секунду надо иметь входной канал не менее 8.8 Mbps. Причём именно inbound. Даже два компа, соединённые напрямую 100 Mbps, когда никто не мешает, ни в жисть не выжмут скорость передачи 12.5 Мб/с, которую Вы насчитали... хорошо если 10.8 получится.

    как решить проблему

    Здесь нет проблемы. Почитайте, что такое "узкое место".

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    3 эконома, 14 комфорта, 9 бизнеса, 4 премиум.


    Итого 3+14+9+4=30.

    Теперь нумеруем каждый тип по отдельности (используем целочисленное деление с остатком).

    Эконом - 1,2,3,31,32,33,61,62,63...
    Комфорт - 4,5,..,16,17,34,35,...
    Бизнес - 18,19,..25,26,48,49,...
    Премиум - 27,28,29,30,57,58,...

    И теперь сортируем при пагинации по этому номеру.

    Оно, конечно, всё равно поплывёт, когда какой-то тип закончится - но хоть не с самого начала.

    PS. Но вообще-то клиент, увидев на странице дикие скачки цен, и прыжки вверх-вниз между страницами, скорее всего закроет этот бред, чтобы мозг не поломался.
    Ответ написан
    Комментировать
  • Как решить олимпиадную задачу python?

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

    Вторая часть задания вообще проста как лапоть. Так что основная проблема - для каждой антенны найти расстояние до ближайшего соседа. Ну тут для ускорения (если антенн реально дофига, 1000 из задания - это не дофига) можно использовать пред-отбор по сетке (для 1000 антенн - сетка 6*6) и пост-отбор если отклонение по любой координате больше текущего минимального расстояния. В среднем это снижает количество считаемых расстояний где-то втрое (999000 или 368000 расстояний - всё же разница).
    Ответ написан
    Комментировать
  • Как задать триггер менять значение в поле при изменении в другом поле?

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

    fiddle
    Ответ написан
    2 комментария
  • Как выполнить backup базы данных mysql запросом?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Очень теоретически можно организовать бэкап БД "одним запросом". И это будет запрос
    CALL stored_procedure(@datatbase_name);
    А вот в хранимой процедуре будет дофига запросов. Нужно будет из INFORMATION_SCHEMA получить список всех имеющихся в БД объектов и организовать копирование информации во внешний файл (причём для каждой таблицы придётся делать два файла - один со структурой, второй с данными). А ещё надо не забыть про процедуры, функции, триггеры... в общем, задачка весьма нетривиальная. Лучше даже не начинать.
    Ответ написан
    Комментировать
  • Как получить по лимиту данные из одной таблицы по разным критериям?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY RAND()) rn
                  FROM ...
                  WHERE ID IN (1, 2, ..100) )
    SELECT *
    FROM cte
    WHERE rn <= 5
    Ответ написан
    2 комментария
  • Как исправить сортировку в MySql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    У SUBSTRING_INDEX накладные расходы великоваты. Я бы использовал
    SELECT *
    FROM table_name
    ORDER BY 0 + SUBSTRING(column_name FROM 2)

    А для совсем ускорения, если такая сортировка используется часто, можно создать индекс по соотв. выражению, а то и generated column с соответствующим индексом.
    Ответ написан
    3 комментария
  • Как обнулить IP адрес?

    @Akina
    Сетевой и системный админ, SQL-программист.
    По договору с провайдером у меня динамический IP. Услугу статического IP я не подключал. Однако мой IP не меняется уже месяц.
    [skipped]
    Что делать и каким способом обнулить время аренды DHCP IP-адреса? Как вернуть динамический IP?
    Для начала - не путайте тёплое с мягким. Да, с цветным тоже не путайте.

    Динамический IP означает, что Вам не нужно прописывать настройки, что все настройки Вы получите от оборудования провайдера по DHCP. Это всё.

    Повторяю - ЭТО ВСЁ! Больше ничего эта фраза в договоре не означает. Она не устанавливает, публичный адрес у Вас будет или приватный (белый или серый), не устанавливает, будет ли адрес всё время один и тот же, или будет периодически либо регулярно изменяться...

    Далее. Время аренды адреса - это параметр, которым оперирует DHCP-сервер провайдера. Он напрямую связан с МАС-адресом Вашего оборудования (сетевая карта, роутер), подключенного к провайдеру, и выделенным для этого МАС IP-адресом. Соответственно "обнулить время аренды" можно двумя способами:

    1) Выключить своё оборудования на время более текущего времени аренды. Ненадёжно - на DHCP соответствие будет сохраняться, пока этот IP не будет выдан кому-то ещё (что в случае проводных провайдеров событие маловероятное).

    2) Сменить МАС-адрес на своём оборудовании. Не будет работать, если у провайдера имеется привязка по порту (причём может быть как привязка клиентского МАС, так и выделяемого IP).

    Многие сайты считают меня ботом и не пускают. Иногда дело доходит до апсурда, и меня в гугле банят. Что искать в Google надо проходить проверку "я не робот", а это очень тяжело, особенно когда приходится две или три попытки делать.


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

    Если отсутствие интерференции с другими клиентами действительно важно - следует приобрести у провайдера услугу выделенного реального IP-адреса. В данном случае:

    "выделенный" - присвоенный только тебе, одновременно с тобой с этого адреса никто работать не может.

    "реальный" - он же белый, адрес, маршрутизируемый в Инете.

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

    @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 ещё и позволяет не трясти более древние записи, которые заведомо не учитываются ни в одной из сумм. Поэтому оно отбирает самый длительный из периодов суммирования, а заодно избавляет от условия агрегирования одно из выражений.
    Ответ написан
    Комментировать
  • Как удалить в базе данных MYSQL все между двумя тегами?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT html, REGEXP_REPLACE(html, '<nav>[^<]*</nav>', '')
    FROM test;

    fiddle
    Ну и соответственно
    UPDATE test
    SET html = REGEXP_REPLACE(html, '<nav>[^<]*</nav>', '');
    Ответ написан
    5 комментариев
  • Как написать запрос для вывода классов в которых только отличники?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT DISTINCT class
    FROM tablename t1
    WHERE NOT EXISTS ( SELECT NULL
                       FROM tablename t2
                       WHERE t1.class = t2.class
                         AND t2.mark != 5 )

    Запрос предполагает, что нет записей, где оценка отсутствует (mark IS NULL).
    Ответ написан
    Комментировать
  • Кто удалил файл?

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

    Из практики - в 90% случаев файл или каталог не удалён. Просто какое-то нерадивое чмо неловким движением мыша переместило его в какой-то каталог. Обычно - даже не заметив этого (оно само, случайно, зацепилось). Опять же из практики - подобное пропадание на Window Server - минимум 2-3 раза в месяц, а на столь же интенсивно использовавшемся Novell Netware, где подобное перемещение было запрещено соотв. атрибутом файловой системы - 2 или 3 раза за более чем 10 лет.

    Настоятельно рекомендую посмотреть в сторону программного обеспечения, которое носит общее название "Сетевая корзина". Суть проста - удалённый по сети файл помещается в корзину так же, как если он удалён в локальном сеансе от имени локальной учётной записи. И восстановить просто, и видно, кто и когда удалил. А если файла в корзине нет - это те самые 90%, см. выше.
    Ответ написан
    Комментировать