|
|
|
Выборка товаров из фильтра, не получается найти пересечение
|
|||
|---|---|---|---|
|
#18+
Добрых каникул. Не удаётся найти решение корректной активации позиций фильтра во время поиска. Фильтр состоит из: Товар (id, цена), Персона(id_товара, id_персоны), Причина(id_товара, id_причины). Хочется найти пересечение, это что-то вроде outer_join, который в mysql добивается из комбинаций left join+unon+right join. к примеру ситуации: 1) при выборе reason_id=10 and person_id=2 активным также является и person_id=1. 2) а при выборе person_id=1 and reason_id=10 активным является person_id=2 И reason_id=1. С помощью каких конструкций в данном случае составляется запрос? Если возможно на примере. Существуют три таблицы: tovar (id,price), 5 - 2342 6 - 8900 7 - 2400 10-2560 12-6500 person(tovar_id,person_id), 5 - 1 (men) 6 - 2 (women) 7 - 3 (child) 10-1 (men) 12-1 (men) reason(tovar_id,reason_id) 5 -1 (happy birth) 6 -10 (good day) 7 -3 (with born) 10-10 (good day) 12-10 (good day) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2016, 23:53:33 |
|
||
|
Выборка товаров из фильтра, не получается найти пересечение
|
|||
|---|---|---|---|
|
#18+
Короче разобрался. Называется это фасетный метод классификации. Некоторые ставят демона на sphinx - это решение для индексирования списка товаров и быстрой выдачи. Я пошёл немного иначе, поскольку мне нужна не выдача, а оптимизации фильтрации и понимание какие фильтры открывать при кликах, а какие делать неактивными. Приведу пример, может кому полезно окажется, кто идёт по аналогичной дорожке и в замешательстве куда двигаться дальше. Есть три фасеты по три признака в каждой, не важно что в них содержится, пункт выбора цены или категория товара. В моём случае p (person) - мужчина(1), женщина(2), ребёнок(3), r(reason) - ДР(1), рождение ребенка(3), успехов(10), f(form) - велосипед(1), обручальное кольцо(2), коляска(3). Первый шаг, создаём матрицу. Выписываем все признаки в строку. В столбцах у нас будут пересечения в позициях. Здесь p1...f3 - Это значения фасетов, id 1-7 - какой-то товар, который содержит признаки по ним. Данные Лист2 Код: xml 1. 2. 3. 4. 5. 6. 7. 8. Шаг второй, строим матрицу p1...f3 X p1...f3. Она будет зеркальная. Теперь проходим получившуюся выше матрицу и смотрим где у нас существуют пересечения и проставляем в новую. Получим такой вот результат. Данные Лист1 Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Теперь у нас есть знание про содержание переходов в нашем фильтре. к примеру, если пользователь выбирает p1, то у нас активируются позиции r1, r10, f1, f3. Плюсы здесь следующие. При поиске товара теперь не нужно обращаться каждый раз к БД и смотреть что мы можем предложить пользователю. Теперь необходимо выбрать конкретно выбранные позиции без переборов, а это сокращает ресурсы. Конечно при добавлении товара, нам необходимо рассчитать всё это заново, но зато потом поиск происходит практически бесплатно. Это не решает задачу с выдачей найденного контента, в этом случае конечно будет обращение к БД по кликам, но это другой вопрос. Данный фильтр можно накрутить на ajax и получим очень быстренькую и шустренькую леталочку. Сорри за сумбур и неаккуратность оформления, отсутствует время для проработка, но суть кому необходимо уловят. Или почитайте курс по дискретной математике с теорией графов про матрицы смежности и матрицы инцидентности и будет понятно о чём здесь выше. также можете поиграть в екселе. На лист1 вешаем макрос Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. на лист2. В случае смены данных, запустите его, чтобы он пересчитал матрицу на листе1, предварительно очистив данные на листе1 Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Данные для тестов были приведены выше. Можно поиграться, посмотреть как будет реагировать фильтр на выбор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 13:30:32 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=114&tid=1832291]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
82ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 235ms |
| total: | 423ms |

| 0 / 0 |
