Прежде всего, я думаю, что вам нужна другая схема. Тот, который у вас есть, сделает вашу задачу очень сложной, потому что она недостаточно гибкая. Я рекомендую что-то вроде этого:
CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(300) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `likes` (
`user` INT NOT NULL,
`interest` VARCHAR NOT NULL,
PRIMARY KEY (`user`,`interest`)
);
(Извините, я не помню, как установить отношения FK в MySQL, но я уверен, что вы можете понять это достаточно легко.)
Затем, чтобы определить количество лайков для каждого пользователя:
SELECT COUNT(*)
FROM users
JOIN likes ON likes.user=users.id
WHERE users.name = 'bob';
Затем, чтобы определить, сколько лайков имеют два общих пользователя:
SELECT COUNT(*)
FROM users AS u1
JOIN likes AS l1 ON (l1.user = u1.id)
JOIN likes AS l2 ON (l1.interest = l2.interest)
JOIN users AS u2 ON (l2.user = u2.id)
WHERE u1.name = 'bob'
AND u2.name = 'alice';
Затем, основываясь на этих трех числах, вы можете рассчитать свои проценты по своему желанию - возможно, в своем клиентском коде, но вы можете использовать подвыборы, чтобы сделать все это на стороне SQL, если хотите.
Пример:
USERS:
id | name
----+-------
1 | bob
2 | alice
LIKES:
user | interest
------+----------
1 | fish
1 | baseball
2 | fish
2 | cooking
2 | baseball
Выполнение первого запроса для bob
и alice
покажет, что у bob есть интересы 2 , а у Алисы 3 . Затем выполнение второго запроса покажет, что они с Бобом и Алисой имеют общие интересы 2 .
Затем вы можете показать Бобу, что Алиса разделяет 100% его интересов (2/2 = 100%), и можете показать Алисе, что Боб разделяет 66% (2/3 = 66%) ее интересов.