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
Проблема составления Sql запроса
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 совпадений стояло.
Как быть?
Спасибки.
Цитата:
Originally posted by vov4ik
А надо чтоб у него 0 совпадений стояло.
А надо чтоб у него 0 совпадений стояло.
Примерно так:
Код:
Это синтаксис Oracle, в MySQL не поддерживается. Значок (+) означает внешнее объединение. Поищи по форуму, посмотри, как его записать через left join.
Что делать? Как его оптимизировать то?
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