作为标题的建议,我想根据基于meta关键字的客户购买的图书查找相似的图书。下面的查询有效,但是我被告知可以简化。
SELECT DISTINCT oth.book
FROM book_meta_keywords oth
INNER JOIN books b ON b.id = oth.book
, (SELECT bmk.meta_keyword AS metaKeyword, bmk.book AS book
FROM books b
INNER JOIN customers_books cvb ON cvb.book = b.id
INNER JOIN book_meta_keywords bmk ON bmk.book = b.id
WHERE cvb.customer = 1 ) AS allCustomerPurchasedBooksMeta
WHERE oth.meta_keyword = allCustomerPurchasedBooksMeta.metaKeyword
AND oth.book != allCustomerPurchasedBooksMeta.book
AND b.status = 'GOOD'
表结构
book_meta_keywords
book meta_keyword
1 history
1 culture
2 culture
3 facts
books
id status
1 GOOD
1 GOOD
2 GOOD
3 GOOD
customers_books
book customer
1 90
我应该得到输出书-2。
希望我的表格数据对您有用,如果不让我知道很高兴对其进行纠正。
更新
我现在正在使用以下查询
SELECT 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
AND bmk2.book <> bmk1.book
INNER JOIN books b ON b.id = bmk2.book
WHERE cb.customer = 1 AND b.status = 'PUBLISHED'
GROUP BY bmk2.book
ORDER BY MAX(b.modified_date) DESC
此查询返回
13
3
11
但是我期望只有3个,因为客户已经购买了13和11本书。 要查看客户购买的图书,您可以运行以下查询,返回13、11
SELECT c.book FROM customers_books c WHERE c.customer = 1
完整的表结构和SQL在下面的数据库小提琴中提供。 https://www.db-fiddle.com/f/tovUePp2WVffXLcuaxmJ8K/5
您认为这是什么问题。我认为
这行AND bmk2.book <> bmk1.book
不起作用。
答案 0 :(得分:1)
您可以通过联接来实现:
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
查询从客户1购买的书籍开始,然后带入相应的关键字,最后得到所有具有相同关键字的其他书籍。
注意:
如果各本书中有多个匹配的关键字,则结果集中将出现重复的关键字。在这种情况下,请使用select distinct
您不需要表book
即可获得所需的结果-如果出于某种原因需要,则可以再添加一个联接来添加它