我正在努力为客户找到推荐的书籍,根据他已经购买的书籍。推荐基于图书元关键字表。客户已经购买了图书13和14,我希望sql查询返回3,因为这是唯一一本与其他2本图书具有匹配a元关键字的图书。
要查看客户购买的图书,您可以运行以下查询,返回13,11 SELECT c.book FROM customers_books c WHERE c.customer = 1
我认为这行AND bmk2.book <> bmk1.book没有像预期的那样工作。
请在这里查看我的示例sql。https://www.db-fiddle.com/f/tovUePp2WVffXLcuaxmJ8K/5
发布于 2020-12-30 18:45:16
INNER JOIN的工作方式与您的预期不符。当它试图以13<>11的身份加入第13册和第11册时,AND bmk2.book <> bmk1.book就变成了真的。客户在customers_books表中可以有多本书,这将在INNER JOIN中创建问题
您需要NOT EXISTS,如下所示:
SELECT distinct bmk2.book
FROM customers_books cb
INNER JOIN book_meta_keywords bmk1
ON bmk1.book = cb.book
INNER JOIN book_meta_keywords bmk2
ON bmk2.meta_keyword = bmk1.meta_keyword
INNER JOIN books b ON b.id = bmk2.book
WHERE cb.customer = 1 AND b.status = 'PUBLISHED'
AND NOT EXISTS (SELECT 1 FROM customers_books cbb
where cbb.book = bmk2.book
and cbb.customer = cb.customer)https://stackoverflow.com/questions/65505541
复制相似问题