Мои базы данных сохраняют пользователей, песни и плейлисты, а также позволяют пользователю сохранять свои любимые песни. Я хочу помочь пользователю найти плейлисты, которые наиболее похожи на их сохраненные песни. Допустим, данные выглядят так:
users_saved_songs
user_id song_id
1 1
1 2
1 3
1 4
2 1
2 3
2 5
2 7
3 2
3 4
3 6
3 8
3 10
playlists_songs
playlist_id song_id
1 1
1 5
1 9
1 13
2 2
2 6
2 10
2 14
3 1
3 2
3 4
3 7
3 10
3 13
3 15
Я хочу найти плейлисты, которые имеют наибольшее количество общих песен с сохраненными песнями пользователя. Таким образом, учитывая ID пользователя 1, их сохраненные песни [1,2,3,4]. Я хочу заказать плейлисты, основываясь на том, сколько у них общих песен: у плейлиста 1 есть 1 песня, у плейлиста 2 есть 1, а у плейлиста 3 есть 3. Что за запрос (я использую Postgres), который позволил бы мне сделать это? Принимая во внимание, что пользователь может иметь сотни сохраненных песен, и есть десятки тысяч списков воспроизведения, которые могут содержать от 1 до 500 песен. Есть ли способ написать запрос, чтобы получить эту информацию? Или лучше кэшировать этот «счет матча» в отдельной таблице (user_id, playlist_id, match_count)?