Я хочу показать топ-5 пользователей на панели инструментов зарегистрированных пользователей по следующим критериям:
пользователи выбирают следующие атрибуты в своем профиле:
Relationship preferences,
Hobbies,
Interests,
Language etc
Чем больше предпочтений будет соответствовать, тем больше будет присвоен приоритет профиля пользователя
table_users
userid ufname ulname gender
--------------------------------
1 test1 Test2 M
2 testF TestF F
3 testF1 TestF1 F
4 testF2 TestF2 F
5 testF5 TestF2 F
table_preferences
preference_id user_preferences
--------------------------------
1 Cooking
2 Gardening
3 Smoking
4 Single
5 widow
6 traveling
table_user_preferences
userid user_preference_id
--------------------------------
1 1
1 2
1 3
1 4
2 3
2 4
3 2
3 3
3 6
4 1
5 1
5 2
5 3
5 4
5 6
Теперь, предположим, что пользователь один вошел в систему, на его панели мониторинга другие зарегистрированные пользователи (с противоположным, т. Е. Полом, женщиной) получат отображение, чьи самые высокие атрибуты совпадают. Как мы видим, пользователь 5 и 5 соответствует большинству атрибутов, поэтому он будет отображаться в верхней части списка, а остальные будут отображаться соответственно следующим образом:
Требуется результат:
User_id ufname
5 testF5
3 testF1
2 testF
4 testF2
Мой запрос — я думаю использовать поиск по релевантности. Подойдет ли это. Любой может помочь мне с любыми предложениями.
Простое использование MYSQL JOIN
а также SUBQUERY
1) Использование subquery
чтобы получить предпочтение вошедшего в систему пользователя.
2) Затем объедините table_user_preferences с table_users с помощью ON tu.userid = tup.userid
а также AND tu.gender !=$current_user_gender
а также IN( )
условие, чтобы соответствовать предпочтению с вошедшим в систему предпочтением пользователя.
3) Наконец, сгруппируйте пользователя и примените порядок по количеству предпочтений совпадений.
select tu.*,tup.userid,count(1) as total_match
from table_user_preferences as tup
join table_users as tu
ON tu.userid =tup.userid
where tup.user_preference_id
IN (select up.user_preference_id from table_user_preferences as up where up.userid=$current_userid)
AND tu.gender !=$current_user_gender
group by tup.userid order by total_match desc limit 5
Других решений пока нет …