Relate tables to make customer recommendations?

1

I have a table "tanned", "commented" and "visited", every time a user likes, comments or visits a certain book on my page a record is inserted into the database for such:

Tanned table:

+----------------+-------------+
| id_livro       | usuario     |
+----------------+-------------+
|     1          | user_id     |
+----------------+-------------+
|     4          | user_id     |
+----------------+-------------+
|     1          | user_id     |
+----------------+-------------+

Commented Table:

+----------------+-------------+
| id_livro       | comentario  |
+----------------+-------------+
|     1          | coment 1    |
+----------------+-------------+
|     7          | coment 2    |
+----------------+-------------+
|     1          | coment 3    |
+----------------+-------------+

Table visited:

+----------------+-------------+
| id_livro       | usuario     |
+----------------+-------------+
|     1          | user_id     |
+----------------+-------------+
|     6          | user_id     |
+----------------+-------------+
|     4          | user_id     |
+----------------+-------------+

In the example above we see that the book with id 1 is repeated in the 3 tables and the book with id 4 is repeated in two of them, these would be 2 books that I would recommend for customers in a list because apparently they are two "popular" books, how could I organize a SELECT to return the books so that I can organize them on the "recommended" page

    
asked by anonymous 02.02.2017 / 19:14

1 answer

2

You can add 1 to a column if you find the record in another table and use the sum of 3 to sort the results:

SELECT l.id_livro,
       IFNULL((SELECT 1
                 FROM curtidos c
                WHERE c.id_livro = l.id_livro
                LIMIT 1), 0) as curtido, -- Coloca 1 se o livro foi curtido ou 0 se não foi
       IFNULL((SELECT 1
                 FROM comentados c
                WHERE c.id_livro = l.id_livro
                LIMIT 1), 0) as comentado, -- Coloca 1 se o livro foi comentado ou 0 se não foi
       IFNULL((SELECT 1
                 FROM visitados v
                WHERE v.id_livro = v.id_livro
                LIMIT 1), 0) as visitado -- Coloca 1 se o livro foi visitado ou 0 se não foi
  FROM livros l
HAVING (curtido + comentado + visitado) > 2 -- Verifica se aparece em pelo menos 2 tabelas
 ORDER BY (curtido + comentado + visitado) DESC -- Ordena pelos que aparecem em mais tabelas
 LIMIT 3 -- Limita em 3 o número de resultados
    
02.02.2017 / 19:34