Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема составления Sql запроса

9.0K
15 октября 2005 года
vov4ik
20 / / 09.08.2005
Есть пять таблиц:

1 - таблица users (userid,username)
2 - таблица user_sport(userid,sportid)
3 - таблица user_hobby(userid,hobbyid)
4 - таблица sportpref(userid,sportid)
5 - таблица hobbypref(userid,hobbyid)

Входной параметр - userid, например 58.

Надо получить список следующего вида: userid, coincidence.
Из таблиц sportpref и hobbypref по userid (например 58 ) надо получить запрашиваемые sportid и hobbyid. Причем и sportid и hobbyid может быть несколько штук, т.е. спискок sportid и список hobbyid. Затем для каждого userid из users надо найти concidence - количество совпадений найденных между таблицей user_sport и уже найденными списками sportid и hobbyid (из таблиц sportpref и hobbypref).
Т.е. берем одного юзера , например номер 1, из users и проверяем для него таблицы user_sport и user_hobby. В этих таблицах мы смотрим спорты и хобби, которыми занимается наш юзер (номер 1). Затем мы смотрим какими спортами и хобби занимается юзер номер 58. И за каждое совпадение между этими юзерами мы в результирующем списке для юзера номер 1 увеличиваем concidence на единицу. И так для каждого юзера из таблицы Users, кроме самого юзера номер 58. (1,2,3,...,57,59,...,1.000.000). Как видно таблицы users не самая маленькая :) ровно 1.000.000 пользователей.

Пример:
Юзер номер 1
Хобби:
Рисование
Коллекционирование марок
Спорты:
Футбол
Волейбол


Юзер номер 2
Хобби:
Чтение книг
Спорты:
Баскетбол
Бокс
Бадминтон

Юзер номер 3
Хобби:
Онанизм :)
Спорты:
Плавание

...


Юзер номер 58:
Хобби:
Рисование
Чтение книг
Спорты:
Футбол
Бокс
Бадминтон

В результате в списке должно быть:
Юзер номер 1 - 2 совпадения
Юзер номер 2 - 3 совпадения
Юзер номер 3 - 0 совпадений
и т.д. до 1.000.000

Внимание вопрос!!!
Как правильно составить SQL запрос??? (СУБД MySQL)

Я пробую так:
select
user_sport.userid, count(user_sport.userid)
from
user_sport,sportpref
where
sportpref.userid=58 and user_sport.sportid = sportpref.sportid
group by
user_sport.userid

Этот запрос возвращает список только по таблицам sportpref и user_sport (т.е. только по спортам, а надо еще и по хобби), причем если совпадений у юзера не будет, то он просто не попадет в результат. А надо чтоб у него 0 совпадений стояло.
Как быть?

Спасибки.
10
15 октября 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by vov4ik
А надо чтоб у него 0 совпадений стояло.


Примерно так:

 
Код:
select
 user_sport.userid, count(user_sport.userid)
from
 user_sport,sportpref
where
 user_sport.userid = 58 and user_sport.sportid = sportpref.sportid (+)
group by
 user_sport.userid

Это синтаксис Oracle, в MySQL не поддерживается. Значок (+) означает внешнее объединение. Поищи по форуму, посмотри, как его записать через left join.
9.0K
17 октября 2005 года
vov4ik
20 / / 09.08.2005
Я составил следующий запрос, который все делает абсолютно верно.... Ное гео размер и время выполнения заставляют меня плакать...
Что делать? Как его оптимизировать то?

select @ks:= count(*) from sport;
select @wts:=wt/@ks from sportpref where userid=58 limit 1;
select @ch:= count(*) from hobby;
select @wth:=wt/@ch from hobbypref where userid=58 limit 1;

select
users.userid,ifnull(tst.wtsport,0)+ifnull(tst2.wthobby,0) as wt
from
users left join (select user_sport.userid, count(user_sport.userid)*@wts as wtsport from user_sport,sportpref where sportpref.userid=58 and user_sport.sportid = sportpref.sportid group by user_sport.userid) as tst using(userid)
left join
(select user_hobby.userid, count(user_hobby.userid)*@wth as wthobby from user_hobby,hobbypref where hobbypref.userid=58 and user_hobby.hobbyid = hobbypref.hobbyid group by user_hobby.userid) as tst2 on users.userid=tst2.userid
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог