sql >> Databasteknik >  >> RDS >> Mysql

Jämför likheter mellan två resultatuppsättningar

Något så här:

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

Observera att detta inte är särskilt effektivt. Ett sätt att kringgå detta är att skapa en "cachetabell" som innehåller utdata från denna fråga med LIMIT 1 delen borttagen. Lägg till några relevanta index och fråga den här cachetabellen. Du kan ställa in ett cron-jobb för att uppdatera den här tabellen med jämna mellanrum.

Exempel:

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. Visar bild i Ireports med PostgreSql

  2. Hur man definierar en primärnyckel för automatisk ökning i PostgreSQL

  3. Aggregera en enda kolumn i frågan med många kolumner

  4. Vilket Javascript/Jquery-bibliotek som helst för att validera SQL-satsen?