SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 20.11.2016 20:16:31

DoctorWholock
Участник
Зарегистрирован: 20.11.2016
Сообщений: 2

Сравнивание и подсчёт процентных совпадений по интересам у пользователей

Столкнулся с серьёзной проблемой в разработке веб-сайта знакомств для курсовой. Создал всю внешнюю оболочку, обмен сообщениями и т.д., но остался сложный подбор людей по интересам.

Мне нужно, чтобы у пользователей хранились их процентные совпадения по интересам с другими пользователями, чтобы потом я мог находить им друзей. Но сейчас мне нужно конкретно находить процент совпадений.

Ниже прикладываю схему, логику действий, которую я не могу реализовать, и MySQL код таблиц.
Я уже посмотрел все схожие темы но не нашёл ничего столь запутанного, как моё задание. Прошу вашей помощи!

http://s011.radikal.ru/i316/1611/0b/960f7c8739a1t.jpg
Этот "цикл" будет отдельно для каждого Id_music, id_book и id_film, потому в описании они идут через /
1)При добавлении поля Id_music/id_book/id_film в таблицу users создавать цикл, = количеству пользователей - 1. ID нашего пользователя заносится каждый раз на позицию user_one в таблицу Stats, а id того, с кем сравниваем - в user_two.
2)Считать количество записей по id в таблице Listened/Watched/Read, чтобы узнать общее количество интересов в этой категории у нашего пользователя. Тоже самое делаем для пользователя в цикле
3)Поочередно сравнивать поле ID_Music/ID_Book/ID_Film в таблице Read/Listened/Watched нашего пользователя на совпадение с теми же полями у другого пользователя, что сейчас в цикле. В итоге мы получим число совпадений.
4)Сравниваем это число с количеством записей этих пользователей из пункта 2. К примеру, если у нашего пользователя всего 4 записи , а у второго 8, и совпадений 2, мы заносим в таблицу stats 50(%) в поле bks_prcnt/msc_prcnt/flm_prcnt и 25(%) в поле bks_prcnt_rev/msc_prcnt_rev/flm_prcnt_rev, потому что у второго пользователя больше интересов.
5)?цикл заканчивается. Если поля существовали ранее - обновляем, а не создаём их.


CREATE TABLE `users` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` text NOT NULL,
`password` text NOT NULL,
'about' text(500),
PRIMARY KEY (`id`)
 
) ENGINE=InnoDB CHARACTER SET=UTF8;
 
CREATE TABLE `stats` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_one` INT(11) NOT NULL,
`user_two` INT(11) NOT NULL,
`bks_prcnt` INT(4) NOT NULL ,
`bks_prcnt_rev` INT(4) NOT NULL,
 `flm_prcnt` INT(4) NOT NULL,
 `flm_prcnt_rev` INT(4) NOT NULL,
`msc_prcnt` INT(4) NOT NULL,
`msc_prcnt_rev` INT(4) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (user_one) REFERENCES users(id),
FOREIGN KEY (user_two) REFERENCES users(id)
 
 ) ENGINE=InnoDB CHARACTER SET=UTF8;
 
 
 CREATE TABLE `genres` (
`genre_id` INT(11) NOT NULL AUTO_INCREMENT,
`genre_name` text NOT NULL,
PRIMARY KEY (`genre_id`)
 ) ENGINE=InnoDB CHARACTER SET=UTF8;

CREATE TABLE `music` (
`music_id` INT(11) NOT NULL AUTO_INCREMENT,
`title` text NOT NULL,
`id_genre` INT(11) NOT NULL,
`Compositor` text NOT NULL,
PRIMARY KEY (`music_id`) ,
FOREIGN KEY (id_genre) REFERENCES genres(genre_id)
 
) ENGINE=InnoDB CHARACTER SET=UTF8;
 
CREATE TABLE `book` (
`book_id` INT(11) NOT NULL AUTO_INCREMENT,
`title` text NOT NULL,
`id_genre` INT(11) NOT NULL,
`Author` text NOT NULL,
PRIMARY KEY (`book_id`) ,
FOREIGN KEY (id_genre) REFERENCES genres(genre_id)
 
) ENGINE=InnoDB CHARACTER SET=UTF8;
 
 
CREATE TABLE `film` (
`film_id` INT(11) NOT NULL AUTO_INCREMENT,
`title` text NOT NULL,
`id_genre` INT(11) NOT NULL,
`Producer` text NOT NULL,
PRIMARY KEY (`film_id`),
FOREIGN KEY (id_genre) REFERENCES genres(genre_id)
 
 ) ENGINE=InnoDB CHARACTER SET=UTF8;

CREATE TABLE `Listened` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`id_user` INT(11) NOT NULL,
`id_music` INT(11) NOT NULL,  
PRIMARY KEY (`id`) ,
FOREIGN KEY (id_user) REFERENCES users(id),
FOREIGN KEY (id_music) REFERENCES music(id)
 
) ENGINE=InnoDB CHARACTER SET=UTF8;
 
 
CREATE TABLE `Watched` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`id_user` INT(11) NOT NULL,
`id_film` INT(11) NOT NULL,  
PRIMARY KEY (`id`) ,
FOREIGN KEY (id_user) REFERENCES users(id),
FOREIGN KEY (id_film) REFERENCES film(id)
 
) ENGINE=InnoDB CHARACTER SET=UTF8;
 
 
CREATE TABLE `Read` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`id_user` INT(11) NOT NULL,
`id_book` INT(11) NOT NULL,  
PRIMARY KEY (`id`) ,
FOREIGN KEY (id_user) REFERENCES users(id),
FOREIGN KEY (id_book) REFERENCES book(id)
 
) ENGINE=InnoDB CHARACTER SET=UTF8;
 

 

Отредактированно DoctorWholock (20.11.2016 20:36:13)

Неактивен

 

#2 20.11.2016 22:27:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сравнивание и подсчёт процентных совпадений по интересам у пользователей

DoctorWholock написал:

1)При добавлении поля Id_music/id_book/id_film в таблицу users

в таблице users нет таких полей, возможно вы имели в виду Listened/Watched/Read ?

зачем в Listened/Watched/Read поле id ?

имеет ли смысл пересчитывать совпадение интересов после каждой записи в Listened/Watched/Read, а не по расписанию ?

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

Непонятно, что именно вам не понятно.

Неактивен

 

#3 20.11.2016 22:39:29

DoctorWholock
Участник
Зарегистрирован: 20.11.2016
Сообщений: 2

Re: Сравнивание и подсчёт процентных совпадений по интересам у пользователей

vasya написал:

DoctorWholock написал:

1)При добавлении поля Id_music/id_book/id_film в таблицу users

в таблице users нет таких полей, возможно вы имели в виду Listened/Watched/Read ?

Да, просто переделывал несколько раз за последние сутки, уже путаюсь.

vasya написал:

зачем в Listened/Watched/Read поле id ?

Я думал использовать его чтобы посчитать количество интересов в книгах/фильмах/музыке каждого пользователя. Вроде Count id Where id_user=my_id

vasya написал:

имеет ли смысл пересчитывать совпадение интересов после каждой записи в Listened/Watched/Read, а не по расписанию ?

Можно было бы по расписанию, но это уже потом можно добавить, главное что запрос этот будет происходить при каком-то катализаторе, будь то время или добавление/удаление записи.

vasya написал:

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

Может оно не продуктивно, но ваш вариант вроде подразумевает дополнительную проверку для моего цикла, а мне хотя бы с основой разобраться


vasya написал:

Непонятно, что именно вам не понятно.

Как написать данный цикл. Моих знаний хватило лишь на то чтобы создать сайт, который заносит и вытягивает информацию из базы, но такие сравнения слишком сложные для меня.
Знаю, что мне следовало уделить этой задаче больше времени, но я не видел её полностью до последних дней.

Неактивен

 

#4 20.11.2016 23:17:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сравнивание и подсчёт процентных совпадений по интересам у пользователей

DoctorWholock написал:

Я думал использовать его чтобы посчитать количество интересов в книгах/фильмах/музыке каждого пользователя. Вроде Count id Where id_user=my_id

count(*) where id_user=my_id

DoctorWholock написал:

Может оно не продуктивно, но ваш вариант вроде подразумевает дополнительную проверку для моего цикла, а мне хотя бы с основой разобраться

мой вариант подразумевает совсем другой цикл:
например, добавили запись в `Read` (Х,У):
ищем юзеров, которые читали книжку У
select id_user from `read` where id_user<>'X' and id_book='Y'
для каждого из этих пользователей ищем кол-во совпадений с пользователем Х
select count(*) from `read` where id_user = 'другой юзер' and id_book in (select id_book from `read` where id_user = 'X');


DoctorWholock написал:

Как написать данный цикл.

Это слишком общий вопрос.
В этих статьях есть примеры хранимых процедур с циклами и подробными комментариями:
http://webew.ru/articles/2080.webew
http://sqlinfo.ru/articles/info/22.html

Неактивен

 

Board footer

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