URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 7959
[ Назад ]

Исходное сообщение
"MySQL сложный поиск в группах с ИЛИ  "

Отправлено greenwar , 27-Мрт-15 15:57 
добрый день
есть такое условие у банка, который требует документы от клиента, ему нужна 2-ндфл ИЛИ трудовая
при поиске неизвестно, чего хочет банк, банков много, просто нет трудовой у клиента например (tk=0), как выкинуть банк, который её требует в пакете условий?
как его сохранить вообще в базе правильно и потом найти?
условия могут быть такими:
1. пакет документов.
2. пакет + один из нескольких + еще один из нескольких.
3. пакет + (один ПАКЕТ ИЛИ второй ПАКЕТ ИЛИ третий пакет)

если делать через отдельную таблицу, куда складывать условия-пакеты, то примерно как-то так:
bank='bank1',packet='packet1',doc1='ndfl',doc2='tk',doc3='td' (это ИЛИ)
bank='bank1',packet='packet2',doc1='pass'
bank='bank1',packet='packet3',doc1='inn'

но тогда, если у клиента нет tk, то where doc1 != 'tk' AND doc2 != 'tk' AND doc3 != 'tk'
а потом ещё раз проверять (для каждого банка), чтобы у этого банка _во всех_ пакетах не было тк
а ещё для каждого документа так делать надо
топорно, мягко говоря..


Содержание

Сообщения в этом обсуждении
"MySQL сложный поиск в группах с ИЛИ  "
Отправлено Павел Самсонов , 27-Мрт-15 16:55 
>[оверквотинг удален]
> так:
> bank='bank1',packet='packet1',doc1='ndfl',doc2='tk',doc3='td' (это ИЛИ)
> bank='bank1',packet='packet2',doc1='pass'
> bank='bank1',packet='packet3',doc1='inn'
> но тогда, если у клиента нет tk, то where doc1 != 'tk'
> AND doc2 != 'tk' AND doc3 != 'tk'
> а потом ещё раз проверять (для каждого банка), чтобы у этого банка
> _во всех_ пакетах не было тк
> а ещё для каждого документа так делать надо
> топорно, мягко говоря..

Таблица banks с полем packet, объединенная таблица documents с полями packet,document.
Select document from documents where packet = 'packet1'  дает состав документов пакета
Select bank from banks, documents where banks.packet=documents.packet and documents.document!='tk',
Дает банки без tk в пакете
Ну тут еще важно как ты у персоны документ хранишь. Можно разделить таблицу документов на таблицу пакетов и справочник документов, но такая реляция уже громоздка.


"MySQL сложный поиск в группах с ИЛИ  "
Отправлено Павел Самсонов , 27-Мрт-15 17:00 
>[оверквотинг удален]
>> AND doc2 != 'tk' AND doc3 != 'tk'
>> а потом ещё раз проверять (для каждого банка), чтобы у этого банка
>> _во всех_ пакетах не было тк
>> а ещё для каждого документа так делать надо
>> топорно, мягко говоря..
> Таблица banks с полем packet, объединенная таблица documents с полями packet,document.
> Select document from documents where packet = 'packet1'  дает состав документов
> пакета
> Select bank from banks, documents where banks.packet=documents.packet and documents.document!='tk',
> Дает банки без tk в пакете

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


"MySQL сложный поиск в группах с ИЛИ  "
Отправлено greenwar , 27-Мрт-15 17:03 
> Ну тут еще важно как ты у персоны документ хранишь

у клиента это
tk=0/1
ну ещё есть транспортное средство год выпуска например...
регион прописки
пздц в общем набор головняков


"MySQL сложный поиск в группах с ИЛИ  "
Отправлено Павел Самсонов , 27-Мрт-15 17:06 
>[оверквотинг удален]
>> а ещё для каждого документа так делать надо
>> топорно, мягко говоря..
> Таблица banks с полем packet, объединенная таблица documents с полями packet,document.
> Select document from documents where packet = 'packet1'  дает состав документов
> пакета
> Select bank from banks, documents where banks.packet=documents.packet and documents.document!='tk',
> Дает банки без tk в пакете
> Ну тут еще важно как ты у персоны документ хранишь. Можно разделить
> таблицу документов на таблицу пакетов и справочник документов, но такая реляция
> уже громоздка.

Но прямое условие выбрать банки, требующие tk будет работать.


"MySQL сложный поиск в группах с ИЛИ  "
Отправлено Павел Самсонов , 27-Мрт-15 17:13 
>[оверквотинг удален]
>> но тогда, если у клиента нет tk, то where doc1 != 'tk'
>> AND doc2 != 'tk' AND doc3 != 'tk'
>> а потом ещё раз проверять (для каждого банка), чтобы у этого банка
>> _во всех_ пакетах не было тк
>> а ещё для каждого документа так делать надо
>> топорно, мягко говоря..
> Таблица banks с полем packet, объединенная таблица documents с полями packet,document.
> Select document from documents where packet = 'packet1'  дает состав документов
> пакета
> Select bank from banks, documents where banks.packet=documents.packet and documents.document!='tk',

Вот я тебе написал, только != заменить на =. Этот селект из этих таблиц дает банки требующие тк
> Дает банки без tk в пакете
> Ну тут еще важно как ты у персоны документ хранишь. Можно разделить
> таблицу документов на таблицу пакетов и справочник документов, но такая реляция
> уже громоздка.


"MySQL сложный поиск в группах с ИЛИ  "
Отправлено greenwar , 27-Мрт-15 17:53 
> Таблица banks с полем packet, объединенная таблица documents с полями packet,document.
> Select document from documents where packet = 'packet1'  дает состав документов
> пакета
> Select bank from banks, documents where banks.packet=documents.packet and documents.document!='tk',
> Дает банки без tk в пакете

вот так придётся для каждого документа делать, а их там ~20


"MySQL сложный поиск в группах с ИЛИ  "
Отправлено name , 27-Мрт-15 17:52 
использовать подзапросы
select bank from banks
where
bank_id not in
(select bank_id from _таблица банков требующих документ 1_)
and
bank_id not in
(select bank_id from _таблица банков требующих документ 2_)
and
bank_id not in
(select bank_id from _таблица банков требующих документ 3_)

хотя все три таблицы имеет смысл привести к нормальной форме
банки:пакеты
пакеты:документы


"MySQL сложный поиск в группах с ИЛИ  "
Отправлено greenwar , 28-Мрт-15 05:30 
>[оверквотинг удален]
> (select bank_id from _таблица банков требующих документ 1_)
> and
> bank_id not in
> (select bank_id from _таблица банков требующих документ 2_)
> and
> bank_id not in
> (select bank_id from _таблица банков требующих документ 3_)
> хотя все три таблицы имеет смысл привести к нормальной форме
> банки:пакеты
> пакеты:документы

вот условие например:
Паспорт + 2-НДФЛ + II документ + III документ
II документ:
Загран/ВУ/ИНН/СНИЛС/ОМС
III документ:
СТС (4 года)/Загран (12 мес)/ДМС/ТК

заметь, первая строка это И
но в каждом из пакетов ИЛИ - нужен хотя бы 1 документ
и это не то условие, которое надо просто в sql перевести
это я клиентом с соответствующими документам должен найти банки с подходящими условиями
по-моему оно тут не сработает

как-то так:
разбить банк на пакеты и хранить в виде:
Паспорт
2-НДФЛ
Загран/ВУ/ИНН/СНИЛС/ОМС
СТС (4 года)/Загран (12 мес)/ДМС/ТК

потом найти те пакеты, которым удовлетворяют мои документы
и найти те банки, в которых ВСЕ их пакеты удовлетворены

table packets:
bank packet pass ndfl zagran vu inn snils oms sts zagranT dms tk
sber     1          1      0         0     0  0    0    0   0     0     0   0
sber     2          0      1         0     0  0    0    0   0     0     0   0
sber     3          0      0         1     1  1    1    1   0     0     0   0
sber     4          0      0         0     0  0    0    0   4     12    1   1


"MySQL сложный поиск в группах с ИЛИ  "
Отправлено Павел Самсонов , 29-Мрт-15 18:00 
>[оверквотинг удален]
>        1    
>  1  1    1    
> 1   0     0  
>   0   0
> sber     4      
>    0      0  
>        0    
>  0  0    0    
> 0   4     12  
>  1   1

Теперь понятно, в принципе решение, только в примере паспорт и ндфл всегда 1 а, II и III документы дают 16 комбинаций, то есть 16 вариантов пакетов для сбербанка. И проверять потом придется точное совпадение строки киента со строкой пакета и единицы и нули.


"MySQL сложный поиск в группах с ИЛИ  "
Отправлено greenwar , 30-Мрт-15 07:41 
> Теперь понятно, в принципе решение, только в примере паспорт и ндфл всегда
> 1 а, II и III документы дают 16 комбинаций, то есть
> 16 вариантов пакетов для сбербанка. И проверять потом придется точное совпадение
> строки киента со строкой пакета и единицы и нули.

нет, как раз каждый пакет отдельно стоящий и должен совпасть строго по своему пункту(ам)