Query between tables

1

I need to make a query as follows: select a jovem that is in the same cidade and estado as mentor and has the largest number of features equal to mentor .

My query:

SELECT * 
FROM jovem 
INNER JOIN mentor ON jovem.jcidade = mentor.mcidade AND jovem.jestado = mentor.mestado 
WHERE jovem.jfaixaetaria = mentor.mfaixaetaria
  AND jovem.jescolaridade = mentor.mescolaridade 
  AND jovem.jhobby = mentor.mhobby 
  AND jovem.jcomida = mentor.mcomida 
  AND jovem.jmusica = mentor.mmusica 
  AND jovem.jesporte = mentor.mesporte 
  AND jovem.jtime = mentor.mtime 
  AND jovem.jcaracteristica = mentor.mcaracteristica 
  AND jovem.janimal = mentor.manimal 
  AND jovem.jlivro = mentor.mlivro 
  AND jovem.jsonho = mentor.msonho

Structure of the tables:

    
asked by anonymous 17.01.2018 / 14:54

2 answers

2

One way you can do to achieve the result is to compare the columns and with CASE WHEN returning 1 to equal values and 0 to different, in the end just add the return of each comparison, follow the example below.

Note: I only put 2 comparisons because I do not know the characteristics (columns) you want to count.

SELECT 
  jnome AS jovem
  , mnome AS Mentor
  , (
    (CASE WHEN jfaixaetaria = mfaixaetaria THEN 1 ELSE 0 END) +
    (CASE WHEN jescolaridade = mescolaridade THEN 1 ELSE 0 END)
  ) AS qtdCaracteristicasIguais
FROM ligacao
LEFT JOIN mentor ON ligacao.mentor = mentor.CPF
LEFT JOIN jovem ON ligacao.jovem = jovem.CPF
WHERE mcidade = jcidade
AND mestado   = jestado 

Here's an example running online:

SQLFiddle

    
17.01.2018 / 15:55
1

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
    
        
    17.01.2018 / 15:48