powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка товаров из фильтра, не получается найти пересечение
2 сообщений из 2, страница 1 из 1
Выборка товаров из фильтра, не получается найти пересечение
    #39143964
Freeze729
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрых каникул.

Не удаётся найти решение корректной активации позиций фильтра во время поиска.
Фильтр состоит из: Товар (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)
...
Рейтинг: 0 / 0
Выборка товаров из фильтра, не получается найти пересечение
    #39144523
Freeze729
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче разобрался.
Называется это фасетный метод классификации. Некоторые ставят демона на 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.
ID	p1	p2	p3	r1	r3	r10	f1	f2	f3
1	1			1			1		
2		1			1				1
3			1		1			1	
4	1					1			1
5	1			1			1		
6		1				1			1
7		1			1			1	



Шаг второй, строим матрицу p1...f3 X p1...f3. Она будет зеркальная.
Теперь проходим получившуюся выше матрицу и смотрим где у нас существуют пересечения и проставляем в новую.
Получим такой вот результат.
Данные Лист1
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	p1	p2	p3	r1	r3	r10	f1	f2	f3
p1				1		1	1		1
p2					1	1		1	1
p3					1			1	
r1	1						1		
r3		1	1					1	1
r10	1	1							1
f1	1			1					
f2		1	1		1				
f3	1	1			1	1			



Теперь у нас есть знание про содержание переходов в нашем фильтре.
к примеру, если пользователь выбирает 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.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 
 If Target.Column > 1 And Target.Column < 11 And Target.Row = 1 Then
   'Cells(1, 1) = Target.Row& & Target.Column
   For i = 2 To 10
      Cells(i, 1).Interior.Pattern = xlNone
      Cells(i, 1).Interior.TintAndShade = 0
      Cells(i, 1).Interior.PatternTintAndShade = 0
      Cells(1, i).Interior.Pattern = xlNone
      Cells(1, i).Interior.TintAndShade = 0
      Cells(1, i).Interior.PatternTintAndShade = 0
   Next i
   For i = 2 To 10
      If Лист1.Cells(i, Target.Column) <> "" Then
        Cells(i, 1).Interior.ThemeColor = xlThemeColorAccent3
        For k = 2 To 10
          If Cells(i, k) <> "" Then
            'Cells(k, 1).Interior.ThemeColor = xlThemeColorAccent2
            'Cells(1, k).Interior.ThemeColor = xlThemeColorAccent2
          End If
        Next k
      End If
     
   Next i
 End If
 
 
End Sub



на лист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.
Sub d()

Dim a(1 To 100, 1 To 100) As String

i = 2
Do While Лист2.Cells(i, 1) <> ""

  For j = 2 To 10
    a(i - 1, j - 1) = Лист2.Cells(i, j)
  Next j
  i = i + 1
Loop

For i = 2 To 10
  For j = 2 To 10
    For k = 2 To 10
      If a(i - 1, j - 1) <> "" And a(i - 1, k - 1) <> "" And j <> k Then Лист1.Cells(j, k) = 1
    Next k
  Next j
Next i

End Sub



Данные для тестов были приведены выше. Можно поиграться, посмотреть как будет реагировать фильтр на выбор.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка товаров из фильтра, не получается найти пересечение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]