建筑分割

Building segmentation

我正在尝试为图书馆应用程序构建高级搜索功能。我有的是 Books 和他们的 Properties.

所以如果书籍是:

1  LOTR
2  Harry Potter 1
3  Harry Potter 2

属性为

id  book_id  key        value
1   1        available  0
2   2        available  10
3   2        author     Tolkien
4   3        author     Rowling
5   2        price      150
6   3        price      163

我需要的是找到具有以下内容的书籍price = 150 and author = (null or Tolkien)

根据我的能力,我已经能够通过 properties 上的 2 个连接来做到这一点,但是,唉,这无济于事(这可能会继续到 10 个连接)。有没有更好的方法来实现这一点?

可能不是最优雅的,但一种选择是 COUNT 增加符合条件的行数,并且只有 return book_ids 符合所有条件:

SELECT book_id FROM (
    SELECT book_id
    FROM Properties
    WHERE
        (key = 'price' AND value = 150) OR
        (key = 'author' AND (value IS NULL OR value = 'Tolkein'))
        -- OR condition 3 etc.
) M
GROUP BY book_id
HAVING COUNT(*) = 2