【发布时间】:2020-09-24 19:51:26
【问题描述】:
正如标题所暗示的,我想根据元关键字根据客户购买的书籍找到类似的书籍。下面的查询有效,但有人告诉我这可以简化。
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
下面的 DB fiddle 提供了完整的表结构和 SQL。 https://www.db-fiddle.com/f/tovUePp2WVffXLcuaxmJ8K/5
你认为是什么问题。我认为
这条线AND bmk2.book <> bmk1.book 不工作。
【问题讨论】:
-
今日提示:随处切换到现代、明确的
JOIN语法!更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接! -
您的问题是什么?您的编辑不清楚。但是--请不要插入编辑/更新,只是让您的帖子成为编辑时最好的演示文稿。请将您需要的内容放在您的帖子中,而不仅仅是在链接中。这包括minimal reproducible example--cut & paste & runnable 代码的代码部分,包括作为代码输入的最小代表性示例;期望和实际输出。 PS 逗号的优先级低于关键字连接,因此混合使用它们会造成混淆。 PS 工作代码问题属于Code Review。 PS你在研究简化的答案时学到了什么? How to Askhelp centerMeta Stack OverflowMeta Stack Exchange
-
@philipxy 现在可以了吗?
标签: sql postgresql join inner-join