首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据图书元关键字根据购买的图书查找相似图书

根据图书元关键字根据购买的图书查找相似图书
EN

Stack Overflow用户
提问于 2020-09-25 03:51:27
回答 1查看 53关注 0票数 1

正如标题所暗示的那样,我想根据客户购买的基于meta关键字的图书来查找类似的图书。下面的查询是有效的,但我被告知这是可以简化的。

代码语言:javascript
复制
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'

表结构

代码语言:javascript
复制
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。

希望我的表格数据对你有用,如果没有,请让我知道,很高兴纠正它。

更新

我现在正在使用下面的查询

代码语言:javascript
复制
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      

此查询将返回

代码语言:javascript
复制
13
3
11

但我预计只有3本,因为客户已经购买了13和11本书。

代码语言:javascript
复制
SELECT c.book FROM customers_books c WHERE c.customer = 1

下面的DB字段中提供了完整的表结构和SQL。https://www.db-fiddle.com/f/tovUePp2WVffXLcuaxmJ8K/5

你认为问题出在哪里?我想这条线路AND bmk2.book <> bmk1.book不能工作。

EN

回答 1

Stack Overflow用户

发布于 2020-09-25 03:59:08

您可以使用joins来完成此操作:

代码语言:javascript
复制
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

查询从customer 1购买的图书开始,然后带来相应的关键字,最后获得所有具有共同关键字的其他图书。

备注:

  • 如果书中有多个匹配的关键字,那么您将在结果集中得到重复。在这种情况下,使用select distinct

  • 您不需要使用表book来获得想要的结果-如果出于某种原因需要,您可以使用多个join

来实现

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64053471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档