sergey_zhuravlev_89: А как угодно. Чаще всего реализуется смесь конечного автомата и простого сравнения строк. Для скорости файл считывается в оперативку и разбирается простым перемещением указателя на текущую точку разбора.
Saboteur: Всё верно. E1 и аналоговая линия - отдельные физические кабеля плюс шлюз или плата в компьютер. SIP предоставляют как через интернет, так и отдельным кабелем или как VLAN внутри интернет-канала, тут зависит от провайдера. IAX практически никто не даёт, хотя с ним проще в NAT, достаточно проброса одного порта. GSM - только шлюзами. Константин: Если ваш провайдер допускает несколько звонков по одному транку, то можно использовать те же данные. Можно подключиться к Ростелекому (Новая телефония) или Мегафону (Мультифон). Можно использовать SipNet, Zadarma и прочих провайдеров IP-телефонии. Можно подключиться сразу к нескольким провайдерам и маршрутизировать звонок в зависимости от точки назначения.
Денис Сечин: Тогда могу только посоветовать через tcpdump или Wireshark посмотреть, что происходит на 21 порту. Там должен быть весь протокол обмена сервер-клиент.
Ezhyg: Активный режим - клиент открывает порт, передаёт его данные серверу, сервер подключается с 20 порта на порт клиента.
Пассивный режим - сервер открывает порт > 1024, передаёт его данные клиенту, клиент подключается к открытому порту сервера. https://msdn.microsoft.com/en-us/library/cc973739%...
Ещё одна проблема в том, что сервер за NAT в пассивном режиме будет передавать внутренний IP-адрес. Для vsftpd надо добавить в настройки pasv_address с внешним IP.
Александр Попов: В принципе, можно написать пачку вложенных REPLACE, удалив цифры и пробелы, затем взять длину строки, в которой должны остаться только запятые, и прибавить единицу.
Не выглядеть такая пачка вложенных вызовов будет жутко.
Артём Каретников: Ну, для варианта ИЛИ я и не писал, только для И с уникальными и неуникальными тэгами. Но таки да, второй вариант я на автомате взял с поиска товаров по параметрам, тут такой не нужен, достаточно слегка COUNT поправить в первом варианте.
Кстати, ни большом количестве пользователей и тэгов надо ещё посмотреть, что будет быстрее - DISTINCT или IN (SELECT), когда в выборке будет раз по 10-20 один и тот же user_id повторяться.
Артём Каретников: Нет. Оно у вас только для варианта ИЛИ. Вы для варианта И сделайте, где у пользователя должны быть все указанные тэги, с учётом возможного их повторения в таблице связи.
Артём Каретников: А вы попробуйте сами и убедитесь, что, во первых, никаких дублей не будет, похоже вы JOIN с UNION перепутали. Во-вторых, попробуйте сами реализовать нужную выборку если в таблице связи (а здесь как раз вариант многие-ко-многим с промежуточной таблицей) пары id-ов не уникальны.
Антонов Денис: Ну, если это MySQL 5.7 и выше, то можно воспользоваться функциями для работы с JSON. В PostgreSQL вроде тоже есть такие. Если нет - то выделять нужную подстроку через SUBSTRING и группировать по ней.
MihailDonskoy: valueStyle.split("(") - разделение из переменной valueStyle по символу "(", на выходе даёт массив подстрок, [1] берёт первый элемент этого массива (zero-based).
Добавлю, тот же workbench с нарисованной в нём схемы базы сам готовит все DDL-команды для её создания. Остаётся только немножко подточить напильником, добавить триггеры, функции и процедуры.