【问题标题】:Inner Join, Join on doesnt work as expected内部加入,加入没有按预期工作
【发布时间】:2020-12-30 10:33:57
【问题描述】:

我正在尝试根据客户已购买的书籍为他推荐书籍。 推荐基于书籍元关键字表。 客户已经购买了书籍 1314,我希望 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

【问题讨论】:

  • 请您edit 包含 SQL 内联以及 DBFiddle 链接的问题。否则,如果链接将来过期,问题将变得毫无意义。

标签: sql postgresql inner-join


【解决方案1】:

INNER JOIN 没有按预期工作。当AND bmk2.book <> bmk1.book 尝试以13<>11 加入 book 13 和 book 11 时,AND bmk2.book <> bmk1.book 变为 true。并且客户可以在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)

SQLFiddle

【讨论】:

  • INNER JOIN book_meta_keywords bmk2 ON bmk2.meta_keyword = bmk1.meta_keyword 在这种情况下我们需要第二次加入吗?以及使查询更简单的任何想法。我听说可以通过连接改进内部选择查询。
  • book_meta_keywords 表在您的查询中需要两次,因为需要一次从 customers_books 映射书籍,一次是根据使用第一次映射找到的书籍映射 meta_keyword。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2016-07-23
  • 2020-07-24
  • 1970-01-01
相关资源
最近更新 更多