Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how do I get a count of matches across multiple tables joining by id?

Tags:

sql

mysql

How can I 'score' results using order by, if possible, by number of matches between a given user and every other user in a table.

Basically, I have a given 'userid' of '1' and I need to check all of this users 'interests' against of users interests and order by the number of like matches between users.

Say userid '1' has 4 interests in common with userid '4', but only 3 interests in common with userid '2', it would return 4 first, then 2, then everyone else with less overall interest matches.

I have tried about 10 different queries to no avail, not even one that was close, which is why I didn't post any of the attempts here.

CREATE TABLE `interests` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `userid` int(12) NOT NULL DEFAULT '0',
  `interest` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `interests` set `userid` = '1', `interest` = 'term1';
INSERT INTO `interests` set `userid` = '1', `interest` = 'term2';
INSERT INTO `interests` set `userid` = '1', `interest` = 'term3';
INSERT INTO `interests` set `userid` = '1', `interest` = 'term4';
INSERT INTO `interests` set `userid` = '2', `interest` = 'term1';
INSERT INTO `interests` set `userid` = '2', `interest` = 'term2';
INSERT INTO `interests` set `userid` = '2', `interest` = 'term8';
INSERT INTO `interests` set `userid` = '2', `interest` = 'term4';
INSERT INTO `interests` set `userid` = '3', `interest` = 'term9';
INSERT INTO `interests` set `userid` = '3', `interest` = 'term2';
INSERT INTO `interests` set `userid` = '3', `interest` = 'term3';
INSERT INTO `interests` set `userid` = '3', `interest` = 'term7';
INSERT INTO `interests` set `userid` = '4', `interest` = 'term1';
INSERT INTO `interests` set `userid` = '4', `interest` = 'term2';
INSERT INTO `interests` set `userid` = '4', `interest` = 'term3';
INSERT INTO `interests` set `userid` = '4', `interest` = 'term4';

The proper result set should look like:

-------
userid
-------
4
2
3

Any help here is greatly appreciated guys.

like image 868
Tony Cross Avatar asked Dec 06 '25 05:12

Tony Cross


1 Answers

You can do a SELF JOIN:

SELECT i2.userid
FROM interests i1
INNER JOIN interests i2
  ON i2.userid <> i1.userid
  AND i2.interest = i1.interest
WHERE i1.userid = 1
GROUP BY i2.userid
ORDER BY COUNT(*) DESC;

ONLINE DEMO

like image 73
Felix Pamittan Avatar answered Dec 07 '25 18:12

Felix Pamittan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!