SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.07.2010 13:09:26

Microname
Участник
Зарегистрирован: 24.07.2010
Сообщений: 8

Помогите решить интересную проблему

Привет, Друзья.

Задача такая. Есть таблица users с анкетами людей.

userID
name (имя)
sex (м,ж)
color (Цвет волос enum 'Светлые','Черные')
lang (знание языков enum 'Английский','Испанский')
user_compareID (фильтр)

1 | Марина | ж | Светлые | Английский | 1
2 | Алекс | м | Черные | Испанский | NULL
3 | Дима | м | Светлые | Английский | NULL
4 | Стас | м | Светлые | Испанский | NULL

Нужно придумать систему для подбора анкет между собой
Создаем другую таблицу users_compare в которой будем хранить фильтры

user_compareID
param (параметр, например пол или цвет волос, т.е. color или lang)
value (значение параметра)
priority (важность параметра)

1 | sex | м | 1
1 | color | Светлые | 0.5
1 | lang | Испанский | 0.2

(т.е. Марина ищет только парня со светлыми волосами и было бы неплохо, чтобы он еще знал испанский)
Результатом должно быть

4 | Стас | м | Светлые | Испанский | NULL (relev=1+0.5+0.2 = 1,7)
3 | Дима | м | Светлые | Английский | NULL (relev=1+0,5+0 = 1,5)
2 | Алекс | м | Черные | Испанский | NULL (relev=1+0+0.2 = 1,2)

Как написать запрос для вывода анкет по степени соответствия ?

Отредактированно Microname (24.07.2010 13:13:25)

Неактивен

 

#2 24.07.2010 13:31:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите решить интересную проблему

Обязательные условия должны быть в WHERE, условия с важностью
менее единицы должны быть в ORDER:

ORDER BY (IF(color = 'light, 0.5, 0) + IF(lang='spanish', 0.2, 0)) DESC;

Разумеется, можно придумывать более сложную функцию (например,
произведение или какой-то полином — только воображение подскажет wink).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson