The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"MySQL сложный поиск в группах с ИЛИ  "
Вариант для распечатки  
Пред. тема | След. тема 
Форум WEB технологии (MySQL)
Изначальное сообщение [ Отслеживать ]

"MySQL сложный поиск в группах с ИЛИ  "  +/
Сообщение от greenwar (ok) on 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'
а потом ещё раз проверять (для каждого банка), чтобы у этого банка _во всех_ пакетах не было тк
а ещё для каждого документа так делать надо
топорно, мягко говоря..

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "MySQL сложный поиск в группах с ИЛИ  "  +/
Сообщение от Павел Самсонов on 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 в пакете
Ну тут еще важно как ты у персоны документ хранишь. Можно разделить таблицу документов на таблицу пакетов и справочник документов, но такая реляция уже громоздка.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "MySQL сложный поиск в группах с ИЛИ  "  +/
Сообщение от Павел Самсонов on 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 в пакете

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "MySQL сложный поиск в группах с ИЛИ  "  +/
Сообщение от greenwar (ok) on 27-Мрт-15, 17:03 
> Ну тут еще важно как ты у персоны документ хранишь

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

4. "MySQL сложный поиск в группах с ИЛИ  "  +/
Сообщение от Павел Самсонов on 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 будет работать.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

5. "MySQL сложный поиск в группах с ИЛИ  "  +/
Сообщение от Павел Самсонов on 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 в пакете
> Ну тут еще важно как ты у персоны документ хранишь. Можно разделить
> таблицу документов на таблицу пакетов и справочник документов, но такая реляция
> уже громоздка.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

7. "MySQL сложный поиск в группах с ИЛИ  "  +/
Сообщение от greenwar (ok) on 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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

6. "MySQL сложный поиск в группах с ИЛИ  "  +/
Сообщение от name (??) on 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_)

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

8. "MySQL сложный поиск в группах с ИЛИ  "  +/
Сообщение от greenwar (ok) on 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

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

9. "MySQL сложный поиск в группах с ИЛИ  "  +/
Сообщение от Павел Самсонов on 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 вариантов пакетов для сбербанка. И проверять потом придется точное совпадение строки киента со строкой пакета и единицы и нули.

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру