Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Невалидные связки, Поиск ошибок менеджеров в биллинге 
:(
    Опции темы
PriZraK
Дата 12.5.2010, 03:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



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

Необходимо в таблице, отвечающий за хранение параметров клиента, найти все возможные ошибки менеджеров. 
Думаю лучше всего делать их на основе правил невалидных связок, то есть если найдена связка: 
Цитата
"тип клиента" = "Юридическое лицо" и "роутер" = "ZERO"

то выводить клиентов с ошибками, но тут же необходимо указать исключения, допустим: 
Цитата
клиент != "Иванов Иван Иваныч" и "тип клиента" = "Юридическое лицо" и "роутер" = "ZERO"

позволит выбрать все ошибки, исключая клиента Иванова Ивана Иваныча.

Упрощённая таблица:
Код

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `A` int(10) unsigned NOT NULL DEFAULT '0',
  `B` int(10) unsigned NOT NULL DEFAULT '0',
  `C` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;

INSERT INTO `test` (`id`, `A`, `B`, `C`) VALUES
(1, 1, 2, 3),
(2, 2, 3, 1),
(3, 3, 1, 2),
(4, 1, 3, 2),
(5, 2, 1, 3),
(6, 3, 2, 1),
(7, 1, 1, 2),
(8, 2, 2, 3),
(9, 3, 3, 1);

Исходя из рассуждения, пишем запрос:
Код

SELECT * FROM  `test` WHERE (B=2 AND C=3) OR (A!=2 AND B=2 AND C=3)

Следуя этим правилам, запрос к БД вернёт строки:
Цитата
id   A    B    C
1    1    2    3
8    2    2    3


Возникает вопрос: как сконструировать запрос, чтоб по правилам B=2, C=3 и A!=2, B=2, C=3 выводился бы ответ:
Цитата
id   A    B    C
1    1    2    3




Это сообщение отредактировал(а) PriZraK - 12.5.2010, 03:25
PM MAIL ICQ Skype GTalk   Вверх
Deniz
Дата 12.5.2010, 06:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Цитата(PriZraK @  12.5.2010,  05:22 Найти цитируемый пост)
Возникает вопрос: как сконструировать запрос, чтоб по правилам B=2, C=3 и A!=2, B=2, C=3 выводился бы ответ:
а так?
Код
SELECT * FROM  `test` WHERE (A!=2 AND B=2 AND C=3)



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akina
Дата 12.5.2010, 07:41 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Ну очень невнятное описание...
Но если сравнить строки:

(B=2 AND C=3) OR (A!=2 AND B=2 AND C=3)
B=2, C=3 и A!=2, B=2, C=3

то как бы очевидно, что в первой стоИт OR, а во второй AND.

Добавлено через 1 минуту и 26 секунд
Я уж не говорю о том, что если поставить AND - то первую группу условий можно смело удалять - что собсно и предлагает Deniz. Ну так... просто исходя из правил логической арифметики...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
PriZraK
Дата 12.5.2010, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



Цитата(Deniz @ 12.5.2010,  06:03)
Код
SELECT * FROM  `test` WHERE (A!=2 AND B=2 AND C=3)

Конечно, данный код, решит именно данную проблему.
Не проблема написать SQL-запрос подогнав его под необходимый вывод.
Проблема в том, что необходимо имея запрос (B=2 AND C=3) – то есть тот, который найдет ошибку, тут же давать исключения из этого результата (A!=2 AND B=2 AND C=3).
Конечно вы можете предложить вариант, когда запрос сначала удалит все исключения, а по оставшемся найдет ошибки. Но в моей ситуации этого сделать нельзя.

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

По сути, запрос должен быть примерно таким – 
Цитата
(B=2 AND C=3) AND (A!=2 AND B=2 AND C=3)
но, данное выражение не имеет смысл, объяснить могу дополнив его ещё одной переменной «D»:
Цитата
(B=2 AND C=3) AND (A!=2 AND B=2 AND C=3 AND D=1)
если мы, добавим колонку D и забьём её значениями (от 1 до 3 например), то при выполнении запроса получим только те строки, в которых присутствует D=1, то есть по сути в данном случае скобки для SQL ровным счетом не чего не значат, условие D=1 будет применяться как к выражение в первой скобки, так и во второй.
PM MAIL ICQ Skype GTalk   Вверх
Akina
Дата 12.5.2010, 19:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

WHERE ((условие невалидности 1) OR (ун2) OR (ун3) OR ...) AND NOT ((условие-исключение 1) OR (уи2) OR (уи3) OR ...) 



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Deniz
Дата 13.5.2010, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



PriZraK, все равно не понятно.
Приведи реальные таблицы (только необходимые поля) и несколько строчек примера по ним.
Может пример Akina чем-то поможет.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
PriZraK
Дата 13.5.2010, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



В данный момент запрос выглядит следующим образом (Oracle):
* прошу извинить за кучу вложенных селектов, уже достаточно раз менял конструкцию запроса в поисках работающего решения.
Код
SELECT
    a.id_connect,
    a.name,
    a.id_user,
    a.id_user_type,
    a.ip_adr,
    a.id_str,
    a.id_router,
    a.name_status,
    a.inet_aton,
    a.user_name,
    a.dt
FROM
    (
        SELECT
            d.id_connect,
            d.name,
            u.id_user,
            u.id_user_type,
            d.ip_adr,
            d.id_str,
            d.id_router,
            d.id_status,
            d.name_status,
            h.user_name,
            h.dt,
            to_number(substr(d.ip_adr,1,instr(d.ip_adr,'.')-1))*power(256,3)+to_number(substr(d.ip_adr,instr(d.ip_adr,'.')+1,instr(d.ip_adr,'.',1,2)-instr(d.ip_adr,'.')-1))*power(256,2)+to_number(substr(d.ip_adr,instr(d.ip_adr,'.',1,2)+1,instr(d.ip_adr,'.',1,3)-instr(d.ip_adr,'.',1,2)-1))*256+to_number(substr(d.ip_adr,instr(d.ip_adr,'.',1,3)+1)) inet_aton
        FROM
            bil.v_connect_detail d,
            dir.users u,
            (
                SELECT
                    t1.id_connect,
                    t1.dt,
                    t1.user_name,
                    t1.id_tarif
                FROM
                    bil.connect_tarifs_hist t1
                LEFT JOIN
                    bil.connect_tarifs_hist t2 ON (t1.id_connect = t2.id_connect and t1.dt < t2.dt)
                WHERE
                    t1.id_tarif=76 AND      # указываем тарифный план
                    t2.id_connect is NULL
                ORDER BY
                    t1.dt DESC
            ) h
        WHERE
            d.id_user = u.id_user AND
            d.id_connect = h.id_connect
    ) a
WHERE
    (a.id_user!=3405 AND a.id_user_type=2 AND a.id_router=26 AND a.id_status=1) AND (a.id_user_type=2)    # невалидные связки и исключения
ORDER BY
    a.name ASC


Таблица bil.v_connect_detail (только задействованные в запросе поля):
* таблица с списком подключений
Цитата
ID_CONNECT      ID_ROUTER    ID_STATUS    ID_STR    ID_USER       IP_ADR                NAME              NAME_STATUS
1512                2             2         393       1205    192.168.2.120     Иванов Иван Иванович       Выключен
285                 2             1         394       60      192.168.2.175     Петров Петр Петрович       Включен
779                 0             2        1029       431     192.168.50.48   Романов Роман Романович      Выключен
780                 2             1        1030       434     192.168.50.49  Муравьев Муравей Муравеевич   Включен
782                 2             2        1032       444     192.168.50.51  Тимофеев Тимофей Тимофеевич   Выключен


Таблица dir.users (только задействованные в запросе поля):
* таблица с клиентами компании
Цитата
ID_USER  ID_USER_TYPE
73             1
74             2
75             1
78             2
79             1


Таблица bil.connect_tarifs_hist (только задействованные в запросе поля):
* история тарифных планов; кто, когда сменил тарифный план.
Цитата
DT                ID_CONNECT   ID_TARIF   USER_NAME
21.03.2006 23:59      797         12       FREEZE
05.04.2006 23:59      912         48       ADMIN
11.04.2006 23:59      919         48       FREEZE
11.04.2006 23:59      920         48       FREEZE
20.04.2006 23:59      933         48       ADMIN
21.04.2006 23:59      928         42       SERG
23.04.2006 23:59      934         48       FREEZE
23.04.2006 23:59      935         48       FREEZE



Далее приведу таблицу БД настройки над биллингом (MySQL), в которой собственно содержаться одновременно и исключения и невалидные связки:
rule1 – rule6 — правило; значения: 0 - не применяется; 1 – равно; 2 – не равно
filter1 — ID тарифного плана
filter2 — ID клиента; при -1 не применяется
filter3 — ID типа клиента; при -1 не применяется
filter4 — ID роутера; при -1 не применяется
filter5 — ID статуса подключения; значения: 0 - не применяется; 1 - включен; 2 - отключен; 3 - сработал лимит; 4 - клиент удалён
filter6ipbegin — начальный IP-адрес подсети
filter6ipend — конечный IP-адрес подсети
Цитата
id   rule1   filter1   rule2   filter2   rule3   filter3   rule4   filter4   rule5   filter5   rule6   filter6ipbegin   filter6ipend   time_error
32     1        76       2       3405       1       2        1        26       1        1       0           -1              -1            0
33     1        76       0       -1         1       2        0        -1       0        0       0           -1              -1            0


В вложении добавлен скриншот надстройки над биллингом, с двумя связками. Одна по идее должна работать как невалидная связка, ну а вторая как исключение.

Это сообщение отредактировал(а) PriZraK - 13.5.2010, 07:06

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  ______.JPG 77,90 Kb
PM MAIL ICQ Skype GTalk   Вверх
Zloxa
Дата 13.5.2010, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



PriZraK, а в чем, собсно вопрос?
Объем еще не значит точность.

Это сообщение отредактировал(а) Zloxa - 13.5.2010, 09:39


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 13.5.2010, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(PriZraK @  12.5.2010,  03:22 Найти цитируемый пост)
как сконструировать запрос

долго втыкал, поправь если не прав:

1) сушествует множество правил для выявления ошибок.
     ("тип клиента" = "Юридическое лицо" и "роутер" = "ZERO")
     ("тип клиента" = "Юридическое лицо" и "роутер" = "ZERO" и "еще занчение" = "бла бла бла")

2) существуют критерии по которым ошибочные данные нужно исключить из списка ошибок. 
     (клиент != "Иванов")
     (клиент != "Петров")
     (клиент != "Сидовор")

отсюда:
Цитата(PriZraK @  12.5.2010,  18:34 Найти цитируемый пост)
Конечно вы можете предложить вариант, когда запрос сначала удалит все исключения, а по оставшемся найдет ошибки.

что если запрос сначала найдет все ошибки, а затем из него исключить "исключения":

Код

select *
  from (select a
              ,b
              ,c
              ,d
          from test
         where (b = 2 and c = 3)
            or (b = 2 and c = 3 and d = 1))
 where a != 2

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0778 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.