2017-11-16 1 views
0

ich eine Datenbank von realem Zustand zum Verkauf zu schaffen habe. Problem ist die Art von Eigenschaften: wenn ich ein Haus habe, habe ich eine Art der Beschreibung, aber wenn es nur ein Land, nicht die Beschreibungen nicht benötigen Anzahl der Bäder zu schließen, nur den Bereich, Frontbereich usw.Mysql innere Verknüpfung mit mehreren Tabellen entsprechend einen Wert

Also habe ich eine Tabelle mit allgemeinen Daten über das Element (imoveis) mit Adresse, Preis etc .. als ich Kategorien von Elementen erstellt (imoveis_categs). Ich habe 5 Kategorien erstellt, für jede Kategorie gibt es eine Tabelle (z. B. imoveis_descr2) mit den spezifischen Merkmalen dieser Art.

Daten einzugeben, es ist einfach, aber meine Daten aufzulisten, ich werde durchführen müssen Abfrage wählen Sie die Elemente entsprechend mit einigen Filtern zu finden. In PHP wird es einfach zu lösen sein, aber ich wundere mich über die Leistung für eine große Menge von Daten und Benutzeranfragen. Besser es mit SQL-Befehlen lösen, dachte ich. Aber mySQL ist nicht mein Bereich, stelle ich mir anfangen, etwas zu ...

SELECT * FROM imoveis INNER JOIN imoveis_descr(imoveis.categ) ... 

Die „maxi“ Bereich der imoveis Punkt auf der rechten Seite Beschreibungstabelle. Es ist möglich, so etwas zu tun? Gibt es einen anderen Weg, der angemessener oder effizienter ist?

EDIT: Ich versuchte, mit einem Beispiel zu klären ... EDIT2: Ich korrigierte das Beispiel, die Spalte "Räume" wird gleich sein. Die Felder sind nicht exklusiv, sowohl Apartment- als auch Hauskategorien haben eine Anzahl von Zimmern.

Table imoveis 
id categ title   price  address ... 
1 2  The House  $ 1000000 Somestreet 77 
2 1  An Appartment $ 500000 Somewhere 11 
3 4  A Land   $ 250000 Nowhere 33 

Table imoveis_descr1 
idImovel rooms area floor ... 
2   2  70  5 

Table imoveis_descr2 
idImovel rooms fieldArea constrArea ... 
1   3  120  80 

Table imoveis_descr4 
idImovel area width height ... 
3   2640 22  120 

Result 
id categ title  price  address rooms fieldArea constrArea area floor  area width height 
1  2  The House $ 1000000 Somestreet 77 3 120 80 null null null null null 
2 1 An Appartment $ 500000 Somewhere 11 2 null null 70 5 null null null 
3 4 A Land $ 250000 Nowhere 33 null null null null null 2640 22 120 
+1

Update Ihre Frage eine richtige Datenprobe hinzufügen und das erwartete Ergebnis . – scaisEdge

+0

Ich werde versuchen, aber es ist unregelmäßig und große Tische, nicht einfach Textbereich setzt in ... – Gustavo

Antwort

1

Einige Ihrer Feldnamen werden in den Ergebnissen (beispielsweise „Zimmer“) dupliziert, wäre es nicht besser, die Felder mit COALESCE zu verschmelzen (wie sie sich gegenseitig ausschließende erscheinen)?

Da die Tabellen Ihrer beziehen sich gegenseitig ausschließend sind, werden Sie nie die gewünschten Ergebnisse mit einem INNER JOIN erhalten, müssen Sie eine OUTER JOIN:

SELECT 
     i.id, 
     i.categ, 
     i.title, 
     i.price, 
     i.address, 
     COALESCE(i1.rooms, i2.rooms) AS rooms, 
     i2.fieldArea, 
     i2.constrArea 
     COALESCE(i1.area, i3.area, ...) AS area, 
     ... 
FROM imoveis AS i 
     LEFT OUTER JOIN imoveis_descr1 AS i1 ON i1.idImovel = i.id 
     LEFT OUTER JOIN imoveis_descr2 AS i2 ON i2.idImovel = i.id 
     LEFT OUTER JOIN imoveis_descr3 AS i3 ON i3.idImovel = i.id 
     ... 
+0

Es gibt kein Problem, wie Zimmer in duplizierten Feldern ist, wird das gleiche für Wohnungen oder Häuser bedeuten. Ich kann jetzt sehen, dass ich es im Beispiel falsch gemacht habe. Aber du hast das Problem beleuchtet, INNER JOIN für alle Beschreibungstabellen zu machen, anstatt den richtigen Namen zu "bauen" ... – Gustavo

Verwandte Themen