Задать вопрос
  • Как составить запрос выборки баллов?

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

    Мне нужно найти запись на который у пользователя где у пользователя 1 накопится допустим 30 баллов, это запись id=5.


    WITH cte AS (
        SELECT *, SUM(point) OVER (ORDER BY point_lifetime) cum_sum
        FROM tablename
        WHERE user_id = 1 --   у пользователя 1 
        )
    SELECT *
    FROM cte
    WHERE cum_sum >= 30   --   накопится 30 баллов
    ORDER BY point_lifetime LIMIT 1;


    PS. Поскольку значения в point_lifetime неуникальны, то однозначного решения может и не быть. Во всяком случае до тех пор, пока не будет точно определён порядок записей при равенстве значений этого поля.
    Ответ написан
    Комментировать
  • Как изолировать 2 сегмента с помощью VLAN на оборудовании Cisco, чтобы они оба имели выход в третий?

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

    В условиях, когда все три узла подключены к одному коммутатору, спасти может только запрет форвардинга с порта Fa0/1 на Fa0/2 и обратно - если такая возможность в коммутаторе вообще есть. По-русски это обзывается "Изолированный режим". Не знаю как он обзывается у Циски - а, например, в D-Link это называется Traffic Segmentation. И выглядит вот так:

    6564623ea9bac451405414.png

    UPDATE.

    Вроде у сиськи он обзывается так же. См. https://www.cisco.com/c/en/us/products/security/wh...

    То есть просто находишь сию настройку, включаешь сегментацию, и разрешаешь Fa0/1 форвардить только на Fa0/3, то же для Fa0/2, а вот Fa0/3 разрешаешь форвардинг и на Fa0/1, и на Fa0/2.

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

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

    Триггер - это хранимый объект, который описывает реакцию на указанное событие. Обычно это событие изменения данных (удаление, вставка, обновление данных таблицы), реже (и не в каждой СУБД поддерживается) событие изменения метаданных (создание, изменение или удаление хранимых объектов или модификация их свойств). Данная реакция заключается в выполнении соответствующего кода (триггерной процедуры либо триггерной функции, зависит от СУБД). Выполняемый код может модифицировать как сами изменяемые объекты, действие над которыми вызвало срабатывание триггера (т.е. модифицировать выполняемые модификации), так и другие объекты. Триггер сам по себе ничего и никуда не возвращает, триггерная процедура тоже ничего не возвращает, триггерная функция - возвращает обновлённое состояние объекта, действие с которым вызвало срабатывание триггера.
    Ответ написан
    Комментировать
  • Как сделать верную группировку в Union?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT id, MIN(type) type
    FROM t1
    WHERE type IN (1, 2)
    GROUP BY id
    Ответ написан
    4 комментария
  • Стоит ли переноносить таблицу из базы mysql?

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

    Если это высоконагруженная таблица с большим потоком запросов на изменение, то имеет смысл для неё создать отдельный tablespace и вынести его на быстрый (SSD) раздел. Плюс согласен с Everything_is_bad - партиционирование (в зависимости от вида основного шаблона запросов в потоке - по юзеру или по дате) может способствовать оптимизации работы с таблицей.
    Ответ написан
    Комментировать
  • Как распределить число равномерно?

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

    Количество(Склад Номер Х) = ВсегоТовара * НомерСклада / ВсегоСкладов - Количество(Склады Номер 1 .. Х-1)


    Т.е. если, как в вопросе, три склада и 5 товаров:

    Склад 1: количество = 5 * 1 / 3 - 0 = 1,666 = 2 штуки
    Склад 2: количество = 5 * 2 / 3 - 2 = 1,333 = 1 штука
    Склад 3: количество = 5 * 3 / 3 - (2 + 1) = 1,666 = 2 штуки


    $amount = 5;
    $num = 3;
    
    for($used = 0, $i = 1; $i <= $num; $i++) {
      $used += ($current = round($amount * $i / $num - $used));
      echo("$i: $current\n");
    }


    https://phpize.online/sql/mysql57/undefined/php/ph...
    Ответ написан
  • Как можно оптимизировать SQL запрос?

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

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

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

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

    Хотя как по мне, следует отделить систему безопасности Постгресса от авторизации в приложении. Мнение по данному вопросу от Everything_is_bad в комментарии - это не сарказм, а весьма правильное замечание.
    Ответ написан
    Комментировать
  • Лимит на количество L2-vlan на L3 коммутаторе brocade?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Документация на странице 7 утверждает, что девайс поддерживает полный набор виланов, все 4096 штук.
    Ответ написан
    Комментировать
  • Как исправить ошибку связанную с FULL JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    MySQL в принципе не знает о существовании FULL JOIN. И это как раз тот редчайший случай, когда сообщение об ошибке не соответствует проблеме.

    Проблема решается эмуляцией. Есть как минимум два варианта:

    SELECT * FROM table1 LEFT JOIN table2 USING (column)
    UNOIN ALL
    SELECT * FROM table1 RIGHT JOIN table2 USING (column) WHERE table1.column IS NULL

    SELECT *
    FROM (
        SELECT DISTINCT column FROM table1
        UNION ALL
        SELECT DISTINCT column FROM table2
        ) AS table0
    LEFT JOIN table1 USING (column)
    LEFT JOIN table2 USING (column)

    Во втором варианте кажется, что DICTINCT не нужны - но с ними работать будет заметно быстрее, особенно если поле индексировано.
    Ответ написан
    2 комментария
  • Как из word перенести таблицу в Excel с сохранением стилей и форматом?

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

    Нет, нельзя. Ширина колонки и высота строки - это именно атрибут колонки/строки. А не прямоугольного диапазона ячеек, в который выполнится вставка. Так что двигать - придётся.

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

    PS. Можно эту таблицу вставлять не как значения ячеек, а как объект Документ MS Word. Вот тогда точно ничего не уплывёт.
    Ответ написан
    4 комментария
  • Как правильно хранить изображения в SQL и как правильно работать с ними в WPF проекте?

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

    Наилучшее решение - файлы хранятся в FileTables либо FILESTREAM, а в таблице лежат ссылки на них. Что приятно - при этом не надо распыляться с безопасностью, за ней следит SQL Server.

    Сравнение параметров для хранения больших двоичных...

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

    PS. Пройдя по ссылке - обязательно прочитать и оригинальный ихнеязычный текст. Как, впрочем, и для любого другого машиннопереведённого текста.
    Ответ написан
  • В чём разница прописывании VLAN на порт коммутатора Awaya?

    @Akina
    Сетевой и системный админ, SQL-программист.
    vlan members 831 21

    Данная команда включает порт 21 в VLAN 831 в режиме tagged. Порт функционирует как trunk либо hybrid.

    vlan ports 21 pvid 831

    Данная команда включает порт 21 в VLAN 831 в режиме untagged. Порт функционирует как access либо hybrid.
    Ответ написан
    Комментировать
  • MySQL автоматически увеличивает размер ячейки?

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

    В MySQL нет "ячеек" - это не Excel. Есть записи, есть поля, есть поле отдельной записи.

    Если в ячейку типа TEXT не влазят данные, MySQL автоматически увеличит её до необходимого размера или выдаст исключение?

    Если размер данных превышает размер для типа данных поля - будет выдана ошибка или предупреждение "data too long". Что именно будет выдано - зависит от того, какой запрос, и от текущих настроек сессии.

    Как сделать "резиновую" ячейку в таблице?

    Никак. Но если нужно помещать в таблицу данные, которые не лезут в LONGTEXT (а это ни много ни мало 4 гигабайта!) - то Вы явно выбрали инструмент не по задаче. Храните такое в файловой системе.
    Ответ написан
  • Почему не даёт зайти в общую папку?

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

    Мой компьютер - ПКМ - Управление - Общие папки - Общие ресурсы - нужный ресурс - ПКМ - Свойства - Разрешения для общего ресурса

    Заодно проверьте в локальных политиках, разрешен ли доступ из сети с пустым паролем (у юзеров пароли же не установлены, верно?). И не запрещён ли кому вообще доступ из сети.
    Ответ написан
  • Как формировать сырые SQL запросы максимально эффективно?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Обычно если в запрос может быть передано значение, а может и нет, делают так:
    ... AND (column = {parameter} OR {parameter} IS NULL) ..

    При подстановке параметра сервер уже на этапе построения плана выполнения запроса, зная значение {parameter}, получит либо
    ... AND (column = {parameter} OR FALSE) .. ==> ... AND (column = {parameter}) ..
    либо
    ... AND (column = {parameter} OR TRUE) .. ==> ... AND (TRUE) ...

    PS. Чтобы не геморроиться с определением, когда ставить WHERE, начальный шаблон делают такой:
    SQL = "SELECT * FROM USERS WHERE 1=1 {} LIMIT %s OFFSET %s"

    и все дополнительные условия формируют в виде
    AND {условие}
    Тогда не надо оглядываться, первое это условие или нет.

    Само же условие 1=1 будет обращено в TRUE и отброшено опять-таки на этапе построения плана.
    Ответ написан
    2 комментария
  • MySQL PDO, Почему все значения при выборке типа string?

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

    То есть какие-то дополнительные преобразования, изменяющие тип данных, выполняет PHP уже после того, как он получил ответ от MySQL. Или не PHP, а коннектор, который PHP использует для доступа к MySQL. Но в любом случае это происходит уже на стороне клиента.

    Предположу, что эмуляция - процесс двусторонний. То есть не только на пути "туда", но и на обратном пути. Что при дополнительной обработке, которую требует настройка PDO::ATTR_EMULATE_PREPARES => true, корёжит тип данных.

    На всякий случай проверьте, не вызывает ли изменение этого флага корректировки других флагов. В частности, PDO::ATTR_STRINGIFY_FETCHES.
    Ответ написан
  • Как отключить автоматическую перезагрузку Windows 10 для установки обновлений?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Планировщик заданий - Библиотека планировщика заданий - Microsoft - Windows - UpdateOrchestrator - Reboot - ПКМ - Отключить
    Ответ написан
    Комментировать
  • Как составить ассоциацию squelize один к одному?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как составить ассоциацию squelize один к одному?

    В MySQL связи "один к одному" не существует в принципе. Точнее, такая связь нереализуема на изменяемом наборе данных. Неважно, напрямую или через какой-либо ORM, включая и Sequelize.

    Возможна только реализация связи "один к (ноль либо один)".
    Ответ написан
    Комментировать
  • Как обезопасить id SERIAL для корректной работы без промежутков значений?

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

    Никто не должен видеть значений автоинкрементного синтетического ключа, кроме самого сервера.

    AI PK существует только и исключительно для правильной работы встроенной подсистемы СУБД, осуществляющей контроль целостности и непротиворечивости данных. Попытка возложить на такое поле ещё какую-то функцию, тем более функцию, в результате выполнения которой значения этого поля станут видны пользователю (ещё хуже - если эти значения станет необходимо видеть пользователю), немедленно порождает проблемы.
    Причём порождаемые проблемы никак не связаны с основной функцией поля - вот какое пользователя собачье дело, последовательны значения или с разрывами? разрывы влияют на уникальность? нет... или они нарушают нормальную работу ссылочной целостности? нет... или они...? нет... А вся претензия в одном - типа "некрасиво". Аргумент для дураков - потому как значение в таблице БД, а некрасивость в выводе на экран, осуществляемом клиентским приложением. Но если даже отсутствие логики не препятствие, так вон тут рядом советовали - заводишь отдельное поле, в него "свой какой-то счётчик" программный, и поддерживай свою непрерывность хоть до посинения! тем более что сейчас найти (актуальную версию любой) СУБД, не поддерживающую CTE, ROW_NUMBER(), тем более ORDER BY - без шансов.
    Ответ написан
    4 комментария
  • Как в sqlalchemy 2.0 добавить запись в таблицу с учётом других таблиц?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ну, скажем, так:
    INSERT INTO Заказ (ПоставщикID, КлиентID, АдминистраторID, {остальные поля})
    VALUES (
        (SELECT ПоставщикID FROM Поставщик WHERE Имя = 'Василий Пупкин'),
        (SELECT КлиентID FROM ...),
        (SELECT АдминистраторID FROM ...),
        {остальные значения}
    )

    А на свой фреймворк отображайте самостоятельно...
    Ответ написан
    Комментировать