【问题标题】:Finding entities (in a many to many relationship) that are related to other entities查找与其他实体相关的实体(在多对多关系中)
【发布时间】:2018-06-07 00:00:35
【问题描述】:

TL;DR 问题

实体 A 与实体 B 具有多对多关系。给定一些实体 B,我如何找到与给定实体 B 相关的所有实体 A?

实际问题

我目前有点卡在SELECTing 多对多关系中的行的问题上。这个问题可以这样表述:

实体 A: Book

每本书都存储在一个名为Books 的表中,如下所示:

DESCRIBE Books;
book_id  |   book_name  |  ... other metadata on books
-- book_id is a PRIMARY KEY

实体 B: Genres

某种类型的类型,如冒险或浪漫,放在这样的表格中:

DESCRIBE Genres;
genre_id  |  genre_name
-- genre_id is a PRIMARY KEY 

关系持有人: BookGenres

每个Entity A,可以关联多个Entity B体裁。例如,哈利波特可以关联到genre_names:“冒险”和“幻想”。关系通过以下方式存储在这里。每行一个(book_id, genre_id) 元组

DESCRIBE BookGenres;
book_id  |  genre_id
-- book_id REFERENCES Books(book_id)
-- genre_id REFERENCES Genres(genre_id)
-- (book_id, genre_id) is UNIQUE pairing

我希望能够SELECT 获取具有某些所需类型的书籍。比方说,我想返回所有book_id,其中这本书的类型为“冒险”和“幻想”。我能做的最好的事情是自我INNER JOIN并检查配对('Adventure','Fantasy')是否存在并返回book_id,但这非常慢,如果我正在寻找n genres 关系,我需要 n INNER JOINS! (不可接受)。我的查询看起来像这样:

SELECT t1.book_id
FROM BookGenres as t1
INNER JOIN Genres as t2
ON t2.genre_id = t1.genre_id
INNER JOIN BookGenres as t3
ON t3.book_id = t1.book_id
INNER JOIN Genres as t4
ON t4.genre_id = t3.genre_id
WHERE t2.genre_name = 'Adventure' AND t4.genre_name = 'Fantasy'

要搜索具有n 指定关系到所需流派书籍,我执行n self INNER JOINS 并检查是否存在这样的配对。这似乎效率低下,我想对这个查询有所帮助,因为我确信这是一个常见问题。

【问题讨论】:

    标签: sql


    【解决方案1】:

    首先,Books 和 Genres 之间的关系是多对多关系,而不是一对多关系。

    据我了解您的问题,您希望返回与所有选定类型匹配的所有书籍的列表。假设您想要关于这本书的更多信息,我已经包含了 Books 表

    SELECT
        Books.book_id
    FROM
        Books 
    WHERE
        book_id IN (SELECT book_id 
                    FROM BookGenres INNER JOIN Genres ON BookGenres.genre_id = Genres.genre_id
                    WHERE Genre.genre_name = 'Adventure') AND 
        book_id IN (SELECT book_id 
                    FROM BookGenres INNER JOIN Genres ON BookGenres.genre_id = Genres.genre_id
                    WHERE Genre.genre_name = 'Fantasy') 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2017-01-30
      • 2012-11-20
      • 1970-01-01
      相关资源
      最近更新 更多