2016-06-30 8 views
0

私は、ライブラリアプリケーションの高度な検索機能を構築しようとしています。私が持っているものは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の結合になる可能性があります)。これを達成する良い方法はありますか?

答えて

1

おそらく最もエレガントな、しかし、1つのオプションは、あなたの条件に一致する行の数までCOUNTになるだけで、それらのすべてを一致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 
+0

さて、これは何私をやっているように見えます瞬間の必要性! – Amit