2016-06-30 13 views
0

Ich versuche, eine erweiterte Suchfunktion für eine Bibliotheksanwendung zu erstellen. Was ich habe, ist Books und ihre Properties.Gebäudesegmentierung

Also, wenn Bücher sind:

1 LOTR 
2 Harry Potter 1 
3 Harry Potter 2 

und Eigenschaften sind

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 

Was ich brauche, ist Bücher zu finden, die die folgenden price = 150 and author = (null or Tolkien)

Von, was ich fähig bin ich konnte dies mit 2 Joins auf properties tun, aber ach, das wird nicht helfen (das könnte bis zu 10 Joins gehen). Gibt es einen besseren Weg, dies zu erreichen?

Antwort

1

Wahrscheinlich nicht das eleganteste, aber eine Option, um COUNT bis die Anzahl der Zeilen sein könnte Ihre Bedingungen und nur zurückgeben book_ids passend, dass alle von ihnen entsprechen:

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

Nun, das scheint zu tun, was ich brauche für den Moment! – Amit