Você pode fazer isso com junções:
select bmk2.book
from customer_books cb
inner join book_meta_keyword bmk1
on bmk1.book = cb.book
inner join book_meta_keyword bmk2
on bmk2.meta_keyword = bmk1.meta_keyword
and bmk2.book <> bmk1.book
where cb.customer = 1
A consulta começa nos livros que o cliente 1 comprou, depois traz as palavras-chave correspondentes e, finalmente, obtém todos os outros livros que têm qualquer palavra-chave em comum.
Notas:
-
Se houver várias palavras-chave correspondentes nos livros, você obterá uma duplicata no conjunto de resultados. Nesse caso, useselect distinct
-
Você não precisa da tabelabook
para obter o resultado desejado - se necessário por algum motivo, você pode trazê-lo com mais uma junção