Frage

Ich versuche, einen Weg, um herauszufinden, eine Eigenschaft Feature-Lookup-Tabelle abzufragen.

Ich habe eine Eigenschaft Tabelle, die das Objekt (Adresse, Miete, Kaution, Anzahl der freien Zimmer, etc.) enthält zusammen mit einer anderen Tabelle (Property_Feature), die die Merkmale dieser Immobilie (Pool, Klimaanlage, Wäscherei steht für On- Website, etc.). Die Funktionen selbst noch in einer anderen Tabelle markiert Eigenschaft definiert sind.

Property
    pid - primary key
    other property details

Feature
    fid - primary key
    name
    value

Property_Feature
    id - primary key
    pid - foreign key (Property)
    fid - foreign key (Feature)

Lassen Sie sagen, jemand will nach Immobilien suchen, die eine Klimaanlage und ein Pool und Wäsche vor Ort. Wie abfragen Sie die Property_Feature Tabelle für mehrere Merkmale für die gleiche Eigenschaft, wenn jede Zeile nur ein Merkmal darstellt? Wie würde die SQL-Abfrage wie? Ist das möglich? Gibt es eine bessere Lösung?

Danke für die Hilfe und Einsicht.

War es hilfreich?

Lösung

In Bezug auf dem Datenbank-Design, sind Sie der richtige Weg, es zu tun. Es ist richtig normalisiert.

Für die Abfrage, würde ich einfach existiert verwenden, wie folgt aus:

select * from Property
where 
exists (select * from Property_Feature where pid = property.pid and fid = 'key_air_conditioning')
and
exists (select * from Property_Feature where pid = property.pid and fid = 'key_pool')

Wo key_air_conditioning und key_pool sind offensichtlich die Schlüssel für diese Funktionen.

Die Leistung wird in Ordnung sein, auch für große Datenbanken.

Andere Tipps

Hier ist die Abfrage, die alle Eigenschaften mit einem Pool finden:

select
    p.*
from
    property p
    inner join property_feature pf on
        p.pid = pf.pid
    inner join feature f on
        pf.fid = f.fid
where
    f.name = 'Pool'

Ich benutze innere Joins statt EXISTS da es ein bisschen schneller zu sein tendiert.

Sie können auch etwas tun:

  SELECT * 
    FROM Property p
   WHERE 3 =
         ( SELECT COUNT(*)
             FROM Property_Feature pf
                , Feature f
            WHERE pf.pid = p.pid
              AND pf.fid = f.fid
              AND f.name in ('air conditioning', 'pool', 'laundry on-site')
         );

Natürlich, wenn Ihr vorderes Ende der fids der Merkmal Elemente erfassen, wenn der Benutzer sich auswählt, können Sie mit der Join verzichten direkt auf fid zu zeichnen und zu beschränken. Ihr vorderes Ende würde wissen, was die Anzahl der Funktionen ausgewählt wurde, so dass der Wert der Bestimmung für „3“ oben ist trivial.

Vergleichen Sie es, Leistung klug, auf die tekBlues Konstruktion oben; Je nach Datenverteilung, entweder eine von ihnen könnte die schnellere Abfrage sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top