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

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

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

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

    А если ещё подключить внешние таблицы (используя FEDERATED ENGINE) - то можно работать и с данными из баз на другом инстансе (сервере) MySQL.
    Ответ написан
    Комментировать
  • Какой выбрать маршрутизатор для сети из 500 пк и 12 VLAN?

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

    Пардон, в каком месте тупит? С микротика в кабинеты и обратно, или между кабинетами?
    Если первое - то none7 скорее всего прав. Всё же у этого Длинка производительность матрицы 128 Гбит, так что десятку она должна пропускать со свистом, используя всего около 15% своей производительности.
    Если второе - то при большом трафике межкабинет может запросто сожрать эти 128Г и не подавиться.
    А ещё я не исключаю, что причина в том, что один кабинет просто делит на всех 1 Гбит. Если его раскидать на сотню клиентов - каждому достанутся слёзы.

    Так что я бы начал с подключения ещё одной оптики-десятки от микротика до длинка и агрегирования этих двух десяток. И аналогично удвоить каналы до клиентских коммутаторов. Даже просто в качестве эксперимента.
    Ответ написан
    Комментировать
  • Адреса сети, ip адреса?

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

    Нет.

    Адрес сети - это вообще IPадрес или это просто номер?

    Это IP-адрес.

    Под что уходят адреса 192.168.1.0 и 192.168.1.255 и 192.168.1.256 при маске 255.255.255.0

    192.168.1.0 - адрес подсети;
    192.168.1.255 - адрес бродкаста подсети;
    192.168.1.256 - не существует.
    Ответ написан
    Комментировать
  • Как вычитать таблицу после JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    NOT IN в большинстве случаев - самая медленная реализация. Лучше использовать, в зависимости от объёма данных и наличия индексов, либо WHERE NOT EXISTS, либо LEFT JOIN WHERE IS NULL.

    SELECT * 
    FROM `table1` 
    JOIN `table2` ON `title`=`sometitle` 
    WHERE NOT EXISTS ( SELECT NULL
                       FROM table3
                       WHERE table1.id = table3.id )
    ORDER BY `date`


    SELECT * 
    FROM `table1` 
    JOIN `table2` ON `title`=`sometitle` 
    LEFT JOIN table3 ON table1.id = table3.id
    WHERE table3.id IS NULL
    ORDER BY `date`


    Что именно использовать - надо смотреть по построенному плану запроса и практическому сравнению производительности запросов.
    Ответ написан
    Комментировать
  • Является ли приемлимой практикой использование JSON обьектов в столбцах таблицы базы данных PostgreSQL?

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

    Если же JSON используется более нагруженно (поиск, сравнение, частичная модификация и пр.), то в большинстве случаев от его использования следует отказываться в пользу нормализованных plain-структур. При правильном индексировании они выиграют у JSON по потреблению ресурсов сервера. Хотя, конечно, в каждом отдельном случае нужно смотреть конкретные условия - тип использования, возможности оптимизации этого процесса в конкретной (версии) СУБД и пр. Да и то, JSON тут реально может конкурировать разве что с EAV.
    Ответ написан
    2 комментария
  • Как отсортировать по столбцу данные, при этом чтобы имя столбца было взято из другого столбца?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В коде SQL запрос выглядит так:
    SELECT ANY_VALUE(title) AS title_list,
           SUM(count_model) AS count_model,
           COUNT(*) AS total,
           ANY_VALUE(created_at) AS `date`
    FROM mymodels
    GROUP BY name_list
    ORDER BY name_list;

    https://dbfiddle.uk/tiX1HDll

    Возможно вместо ANY_VALUE использовать MIN/MAX, это не изменит результата, хотя и противоречит логике.
    Ответ написан
    3 комментария
  • Связи в Mysql, как исправить ошибку 1215?

    @Akina
    Сетевой и системный админ, SQL-программист.
    К самим скриптам есть только одна претензия - в таблице photos отсутствует индекс по product_id, который необходим для создания внешнего ключа. После исправления этого косяка запрос на создание FOREIGN KEY выполняется без проблем.

    FIDDLE

    Но это относится к таблицам без данных или с корректными данными. Если в таблицах имеются данные, противоречащие ограничению внешнего ключа - его создание завершится с ошибкой. Надо просто санировать данные и изменить либо удалить не отвечающие требованиям целостности.

    =========================

    Но это с формальной стороны. А вот логика - она лежит в глубоком ауте. И не понимает, почему идентификатор фотографии должен быть равен идентификатору продукта.
    Ответ написан
    Комментировать
  • Как сделать сортировку по 2 датам?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если показанные исходные точны, то
    ORDER BY COALESCE(NULLIF(date2, ''), date1)
    Ответ написан
  • Могут ли быть два типа связи одновременно между двумя таблицами?

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

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

    Абстрагировавшись от всей теории разработки БД, выбираю самое простое решение ..

    Вы же вместо того, чтобы делать как надо, решили делать через одно место (причём это явно не голова). Как результат - неустранимое противоречие между теорией и получившейся поделкой-уродцем. На что собственно и указал преподаватель, отказавшись смотреть на полученное.

    Чем скорее Вы смиритесь с тем, что следует начать работу заново, тем больше у Вас будет времени на её выполнение...
    Ответ написан
    Комментировать
  • Как максимально надёжно скрыть свой IP адрес?

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

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

    Если комп подключен через коммутаторы - согласен с предыдущим оратором. Довести до роутера в отдельном VLAN. А дальше опять изоляция порта.
    Ответ написан
    3 комментария
  • Как в таблицу sql с 4 столбцами вставить список значений, в котором может быть меньше 4х значений?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Пример реализации, когда показанный список передаётся в запрос как один (многострочный) строковый литерал @list:

    INSERT INTO test (a,b,c,d)
    SELECT a,b,c,d
    FROM JSON_TABLE(
      CONCAT('[', REPLACE(REPLACE(@list, '(', '['), ')', ']'), ']'),
      '$[*]' COLUMNS (
        a INT PATH '$[0]',
        b INT PATH '$[1]',
        c INT PATH '$[2]',
        d INT PATH '$[3]'
        )                   
      ) jsontable

    DEMO fiddle

    Если данные на вставку лежат в файле - есть функция LOAD_FILE (не забыть GRANT FILE).
    Если данные передаются из языка/фреймворка - разумнее прямо там создать JSON и не париться с CONCAT и REPLACE.
    Если NULL не устраивает - добавить COALESCE.
    Ответ написан
    Комментировать
  • Как правильно совместить DELETE и LEFT JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Синтаксис Firebird в принципе не предусматривает многотабличного удаления. Никаких JOIN - это не MySQL. Нужно фильтровать записи - добро пожаловать в мир коррелированных подзапросов и [NOT] EXISTS.

    Руководство по языку SQL для Firebird 2.5, страница 246.
    Ответ написан
    Комментировать
  • Как сгруппировать ответ?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH
    cte1 AS (
      SELECT jsonb_build_object('name',   users.name, 
                               'value',  comments.value,
                               'rating', comments.rating) single_user,
             comments.order_id,
             'comment' || ROW_NUMBER() OVER (PARTITION BY comments.order_id ORDER BY comments.id) num
      FROM users
      JOIN comments ON users.id = comments.user_id
    ),
    cte2 AS (
      SELECT jsonb_build_object('order_id', order_id) ||
             jsonb_object_agg(num, single_user) single_order
      FROM cte1
      GROUP BY order_id
    )
    SELECT jsonb_agg(single_order) final_data
    FROM cte2;

    DEMO fiddle
    Ответ написан
    Комментировать
  • Как задать условие для цикла?

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

    Например, строка {0, 0, 1, 5, 0, 7, 0, 0} превратится в {-1, -1, 1, 5, 0, 7, -1, -1}.

    Всё. Теперь все оставшиеся в массиве нули - это окна.
    Ответ написан
    2 комментария
  • Какая максимальная скорость LAN портов у роутера при одновременном подключении к ним устройств?

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

    Типичное "у меня в подполе происходит стук".

    Да фиг знает... смотря как именно тестировать.

    Если перевести роутер в режим моста, поотключать все внутренние обработки трафика в нём, и тестировать парно WAN <-> LAN1 и LAN2 <-> LAN3, то скорее всего все 4 тестера покажут скорость, близкую к гигабиту. Если тестировать (LAN1, LAN2, LAN3) <-> WAN, опять же всё отключив, то на WAN-порте тестер покажет что-то порядка гигабита, а тестеры на LAN-портах втрое меньше (причём что а) поровну б) стабильно - не гарантировано). Если каждый тестер будет гонять трафик на все остальные три тестера/порта - то в среднем будет по 300 мбит на парный линк и порядка гигабит суммарно на узел.

    А если роутер оставить именно в режиме роутера, то очень трудно предсказать, что получится, насколько производительна программная обработка трафика. И эта производительность критично зависит от задействованных в роутере программных сервисов...
    Ответ написан
    Комментировать
  • Когда сбрасывается global transaction isolation?

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

    Чтобы навсегда - нужно внести изменения в файл опций (my.ini) либо установить соотв. опцию в командной строке сервиса. Можно также использовать SET PERSIST (значение записывается в файл опций mysqld-auto.cnf).

    См. SET Syntax for Variable Assignment - там это описано более подробно.
    Ответ написан
    1 комментарий
  • Как отсортировать массив?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT name, `text`
    FROM product
    JOIN product_attribute USING (product_id)
    JOIN attribute_description USING (attribute_id)
    -- JOIN attribute USING (attribute_id)   -- таблица в запросе не нужна
    GROUP BY 1, 2
    HAVING COUNT(*) > 1;

    fiddle

    Если нужна именно сортировка как в эталоне - ну добавить ORDER BY MAX(attribute_id)

    Таблица attribute потребуется лишь в случае, если данные из неё нужны (например, в запрос добавится отбор по значению attribute_group_id).

    Если надо сравнивать атрибуты у более чем 2 товаров, то соотв. образом откорректировать условие пост-отбора. Например, для 3 товаров и атрибутов, имеющихся у всех трёх, это будет HAVING COUNT(*) = 3
    Ответ написан
  • Как упорядочить id записей в MySQL?

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

    PRIMARY KEY выполняет в таблице только одну функцию - однозначно идентифицирует запись. В нормальных условиях значение такого поля используется исключительно для связывания данных (установления соответствия), и надобности видеть значение этого поля не существует в принципе.

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

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

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

    Правильно:

    SELECT "Items"."itemId", sum(price) / sum( sum(price) ) OVER ()
    FROM "Items"
    INNER JOIN "Purchases" USING("itemId")
    GROUP BY "Items"."itemId"


    Т.е. оконная функция применяется не к исходному полю, а к агрегатной функции.
    Ответ написан
    2 комментария