Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Porównaj podobieństwa między dwoma zestawami wyników

Coś takiego:

SELECT first_user.id_user, second_user.id_user, COUNT(first_user.id_user) AS total_matches

FROM likes AS first_user

JOIN likes AS second_user
ON second_user.id_artist = first_user.id_artist
AND second_user.id_user != first_user.id_user

GROUP BY first_user.id_user, second_user.id_user

ORDER BY total_matches DESC

LIMIT 1

Zauważ, że nie jest to bardzo wydajne. Jednym ze sposobów obejścia tego jest utworzenie „tabeli pamięci podręcznej” zawierającej dane wyjściowe tego zapytania z LIMIT 1 porcja usunięta. Dodaj kilka odpowiednich indeksów i wykonaj zapytania do tej tabeli pamięci podręcznej. Możesz ustawić zadanie cron, aby okresowo aktualizować tę tabelę.

Przykład:

CREATE TABLE IF NOT EXISTS `likes` (
  `id_user` varchar(50) DEFAULT NULL,
  `id_artist` varchar(50) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `likes` (`id_user`, `id_artist`) VALUES ('8', '39'), ('8', '37'), ('4', '37'), ('8', '24'), ('8', '7'), ('4', '28'), ('8', '28'), ('4', '27'), ('4', '11'), ('8', '49'), ('4', '7'), ('4', '40'), ('4', '29'), ('8', '22'), ('4', '29'), ('8', '11'), ('8', '28'), ('4', '7'), ('4', '31'), ('8', '42'), ('8', '25'), ('4', '25'), ('4', '17'), ('4', '32'), ('4', '46'), ('4', '19'), ('8', '34'), ('3', '32'), ('4', '21')

+---------+---------+---------------+
| id_user | id_user | total_matches |
+---------+---------+---------------+
| 8       | 4       |             7 |
+---------+---------+---------------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fluent NHibernate DuplicateMappingException z automappingiem

  2. Jak sprawić, by funkcje NOW() i CURDATE() MySQL używały czasu UTC?

  3. Modelowanie baz danych do celów międzynarodowych i wielojęzycznych

  4. Wybierz wszystkie daty między dwiema datami bez użycia tabeli (wygeneruj listę dat)

  5. jak stworzyć pole obliczeniowe w mysql?