Untested code
I could not test here but the idea is this:
create a temporary table to store what coincides between each jovem
and monitor
who live in the same city;
In the query, add the total of "matches"
Try to do some testing, if logic is not right, we try to fix it.
CREATE TEMPORARY TABLE IF NOT EXISTS tabelaTemporaria AS (
SELECT jovem.jid as 'jid',
mentor.mid as 'mid',
CASE jovem.jfaixaetaria WHEN mentor.mfaixaetaria THEN 1 else 0 end as 'faixaetaria',
CASE jovem.jescolaridade WHEN mentor.mescolaridade THEN 1 else 0 end as 'escolaridade',
CASE jovem.jhobby WHEN mentor.mhobby THEN 1 else 0 end as 'hobby',
CASE jovem.jcomida WHEN mentor.mcomida THEN 1 else 0 end as 'comida',
CASE jovem.jmusica WHEN mentor.mmusica THEN 1 else 0 end as 'musica',
CASE jovem.jesporte WHEN mentor.mesporte THEN 1 else 0 end as 'esporte',
CASE jovem.jtime WHEN mentor.mtime THEN 1 else 0 end as 'time',
CASE jovem.jcaracteristica WHEN mentor.mcaracteristica THEN 1 else 0 end as 'caracteristica',
CASE jovem.janimal WHEN mentor.manimal THEN 1 else 0 end as 'animal',
CASE jovem.jlivro WHEN mentor.mlivro THEN 1 else 0 end as 'livro',
CASE jovem.jsonho WHEN mentor.msonho THEN 1 else 0 end as 'sonho'
FROM jovem INNER JOIN mentor ON jovem.jcidade = mentor.mcidade AND jovem.jestado = mentor.mestado
)
SELECT jid, mid, (faixaetaria + escolaridade + hobby + comida + musica + esporte + time + caracteristica + animal + livro + sonho) as total_caracteristicas
FROM tabelaTemporaria
ORDER BY total_caracteristicas DESC
--LIMIT 2 --LIMIT é opcional para o total que precisar de retornos