MySQL сопоставление двух пользователей на основе предпочтений - PullRequest
0 голосов
/ 25 июня 2018

Хорошо, что мне нужно сделать, это немного сложно, но я сделаю все возможное, чтобы объяснить.Итак, у меня есть такая таблица:

id ||цвет ||redOK ||blueOK ||yellowOK ||greenOK ||orangeOK

1- || ---- 1 --- || ---- 1 ----- || ----- 1 ----- || ------- 1 ------ || ------ 0 ------ || ------ 1 ------

2- ||---- 3 --- || ---- 1 ----- || ----- 0 ----- || ------- 1 ------ || ------ 1 ------ || ------ 1 ------

3- || ---- 1 --- || ---- 0 ----- || ----- 0 ----- || ------- 0 ------ || ------ 0 ------ || ------ 1 ------

4- || ---- 5 --- || ---- 1 ----- ||----- 1 ----- || ------- 0 ------ || ------ 1 ------ ------ ||1 ------

5- || ---- 2 --- || ---- 0 ----- || ----- 0 -----|| ------- 1 ------ || ------ 0 ------ || ------ 1 ------

В поле цвета цифры 1 - 5 представляют собой любимый цвет пользователя (1 для красного, 2 для синего, 3 для желтого, 4 для зеленого и 5 для оранжевого).Поля redOK, blueOk, yellowOK, greenOK и orangeOK представляют, хочет ли пользователь сопоставить кого-либо с определенным любимым цветом.В этих полях 1 представляет да, а 0 представляет нет.Так, например, пользователь с любимым цветом с id = 1 - красный, потому что его поле «color» - 1, и они готовы совпасть с кем-то, чей любимый цвет - красный, синий, желтый или оранжевый, но не зеленый, потому чтополе «greenOK» равно 0. Итак, мне нужно создать хранимую процедуру, которая возвращает запрос пользователям, цвет и предпочтения которых соответствуют цвету и предпочтениям конкретного пользователя.Так, например, пользователи с идентификаторами 1 и 2 будут совпадать, потому что пользователь 1 - красный, а пользователь 2 - что красный - нормально, а пользователь 2 - желтый, а пользователь 1 - желтый.С другой стороны, пользователи 3 и 2 не будут совпадать, потому что, хотя пользователь 3 красный, а пользователь 2 выбрал, что красный в порядке, пользователь 2 желтый, а пользователь 3 сказал, что только оранжевый в порядке.

Я думал об этой проблеме весь день, но не могу придумать решение.Моей первой мыслью было использование оператора SELECT INNER JOIN, но я не совсем уверен, как, поскольку существует так много возможных комбинаций?Затем я попытался создать временную таблицу с предпочтениями пользователя, а затем с помощью курсора перебрать эти предпочтения, проверяя, соответствуют ли предпочтения пользователя цвету целевого пользователя, но я также не смог понять это.Ребята, вы можете помочь?

1 Ответ

0 голосов
/ 25 июня 2018

С таблицей, как есть, есть только пять комбинаций, которые определяют совпадение, которое вы просто ИЛИ вместе в соединении, в обоих направлениях a-> b и a <-b: </p>

select *
from myTable a
join myTable b on (
        (a.color = 1 and b.redOK = 1)
        or (a.color = 2 and b.blueOK = 1)
        or (a.color = 3 and b.yellowOK = 1)
        or (a.color = 4 and b.greenOK = 1)
        or (a.color = 5 and b.orangeOK = 1)
    ) and (
        (b.color = 1 and a.redOK = 1)
        or (b.color = 2 and a.blueOK = 1)
        or (b.color = 3 and a.yellowOK = 1)
        or (b.color = 4 and a.greenOK = 1)
        or (b.color = 5 and a.orangeOK = 1)
    )
where a.id <> b.id

В качестве альтернативы вы можете изменить свою схему, по сути, разворачивая ваши данные в таблицу «многие ко многим».Например:

id    okColor
1     1
1     2
1     3
1     5
2     1
2     3
2     4
2     5

В этом случае вы можете просто присоединиться через эту таблицу:

select distinct a.id, b.id
from myTable a
join okColors aOK on a.id = aOK.id
join myTable b on aOK.okColor = b.color
join okColors bOK on bOK.id = b.id and a.color = bOK.okColor
where a.id <> b.id
...