Вместо того, чтобы пытаться хранить все хобби в одной строке для каждого пользователя и присоединять их (как, кажется, делает ваше представление), а затем пытаться добавить их, гораздо проще рассчитать с улучшенным дизайном базы данных, который выражает отношения между пользователями и хобби, отслеживая их в другой таблице (подумайте, что нужно сделать, чтобы добавить четвертое хобби.). Вам может понадобиться поискать такие термины, как отношение «многие ко многим» и таблица соединений , и / или найти хороший ресурс по проектированию базы данных.
С таким дизайном, учитывая эти таблицы:
CREATE TABLE users(userID INTEGER PRIMARY KEY, userName TEXT UNIQUE);
CREATE TABLE hobbies(hobbyID INTEGER PRIMARY KEY, hobbyName TEXT UNIQUE);
CREATE TABLE interests(userID INTEGER REFERENCES users(userID) ON DELETE CASCADE
, hobbyID INTEGER REFERENCES hobbies(hobbyID) ON DELETE CASCADE
, liked INTEGER
, PRIMARY KEY(userID, hobbyID)) WITHOUT ROWID;
Вы можете рассчитать коэффициент сходства для всех пар с чем-то вроде:
SELECT u1.userName AS "Person 1", u2.UserName AS "Person 2"
, ifnull(total(i1.liked AND i2.liked) / total(i1.liked OR i2.liked), 0.0) AS Similarity
FROM users AS u1
JOIN users AS u2 ON u1.userId <> u2.userId
LEFT JOIN interests AS i1 ON u1.userId = i1.userId
LEFT JOIN interests AS i2 ON u2.userId = i2.userId AND i1.hobbyId = i2.hobbyID
GROUP BY u1.userId, u2.userId;