(при этом используется sqlite, но для работы с другими базами данных ему не нужно много чего-либо):
Учитывая следующую таблицу:
CREATE TABLE ratings(user_id INTEGER, item_id INTEGER, rating INTEGER
, PRIMARY KEY(user_id, item_id)) WITHOUT ROWID;
INSERT INTO ratings VALUES(1,1,1);
INSERT INTO ratings VALUES(1,2,1);
INSERT INTO ratings VALUES(1,3,1);
INSERT INTO ratings VALUES(1,4,0);
INSERT INTO ratings VALUES(1,5,0);
INSERT INTO ratings VALUES(3,1,1);
INSERT INTO ratings VALUES(3,2,0);
INSERT INTO ratings VALUES(3,3,0);
INSERT INTO ratings VALUES(3,4,0);
INSERT INTO ratings VALUES(3,5,0);
INSERT INTO ratings VALUES(4,1,1);
INSERT INTO ratings VALUES(4,2,1);
INSERT INTO ratings VALUES(4,3,1);
INSERT INTO ratings VALUES(4,4,0);
INSERT INTO ratings VALUES(4,5,0);
Этот запрос:
SELECT r1.user_id AS user_id
, sum(r1.rating) AS likes_match
, sum(CASE r1.rating WHEN 0 THEN 1 ELSE 0 END) AS dislikes_match
, count(*) AS total_match
FROM ratings AS r1
JOIN ratings AS r2 ON r2.user_id = 1
AND r1.item_id = r2.item_id
AND r1.rating = r2.rating
WHERE r1.user_id <> 1
GROUP BY r1.user_id
ORDER BY r1.user_id;
Продукты:
user_id likes_match dislikes_match total_match
---------- ----------- -------------- -----------
3 1 2 3
4 3 2 5