MySQL сопоставление двух пользователей на основе предпочтений

0

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

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

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

2- || ---- 3- - || ---- 1- ---- || ----- ----- 0 || ------- [ CN10] ----- || ------ 1- ----- || ------ 1- -----

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

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

5- || ---- 2- - || ---- 0 ----- || ----- ----- 0 || ------- [CN10 ] ----- || ------ 0 ------ || ------ 1- -----

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

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

Теги:
stored-procedures
mariadb

1 ответ

0
Лучший ответ

С таблицей как есть, существует только пять комбинаций, которые диктуют совпадение, которое вы просто должны были бы объединить в объединении в обоих направлениях a-> b и <-b:

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
  • 0
    Спасибо вам большое! Я действительно думал об этом. К сожалению, второе решение не будет работать, потому что у пользователей есть более 1 варианта того, с каким цветом соответствовать, но первое работает просто отлично!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню