뭔가이 매우 효율적 아니라고
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
참고. 이 문제를 해결하는 한 가지 방법은 LIMIT 1
부분이 제거 된이 쿼리의 출력을 포함하는 '캐시 테이블'을 만드는 것입니다. 관련 인덱스를 추가하고이 캐시 테이블을 쿼리하십시오. cron 작업을 설정하여이 테이블을 주기적으로 업데이트 할 수 있습니다.
예 :
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 |
+---------+---------+---------------+
도움을 주셔서 감사합니다. 검색어가 chram처럼 작동합니다. – MonsieurNinja
@sikko 도와 드리겠습니다! 귀하의 프로젝트와 함께 행운을 빈다 :) –