Abfrage über mehrere Tabellen

DiDiJo

Erfahrenes Mitglied
Hi Leute,

ich habe ein kleines Problem mit einer Immobiliensuche auf einem meiner Makler-Webseiten.

Generell läuft die Suche sehr gut und stabil (auch schnell). Nun hat der Makler aber einige Felder in seiner Immobilien-Übertragung hinzugefügt, die nicht in die Standardisierte Immobilien-Datenbank reinpassen. Ich habe die Felder also in einer zweiten Tabelle abgelegt.

Immobilien
IDobjektnr_externObjektnameAnbieteretc
11000Immo 11etc
21001Immo 22etc

Specials
IDobjektnr_externfieldvalue
11000user_interner_objekttypVIP
21000user_interner_objekttypKAPITAL


Ich möchte nun standartmäßig alle Immobilien suchen, die KEINEN "user_interner_objekttyp" zugewiesen haben.


Dafür habe ich in meinem Select, der schon lange bestand folgende Bedingung hinzugefügt:

Code:
"SELECT im.* FROM immobilien im WHERE .... AND (SELECT COUNT(id) FROM immoUserDefined WHERE objektnr_extern = im.objektnr_extern AND field = 'user_interner_objekttyp') = 0 "

Das funktioniert auch soweit, allerdings wird dadurch die Objektsuche unfassbar langsam (bei knapp 1000 Immobilien)!

Ich vermute mal, dass ich das besser mit einem JOIN lösen sollte (was nicht meine Stärke ist). Kann mir vlt. jemand bei einem JOIN Konstrukut helfen, um die Objektsuche zu optimieren. Ich bräuchte natürlich auch noch ein Beispiel, wo ich gezielt nach einem "user_interner_objekttyp" suche ... also alle Objekte die den internen Typen "VIP" haben.
 
Zuletzt bearbeitet:
Also das hier funktioniert schonaml nicht!
Code:
SELECT im.* FROM immobilien im LEFT JOIN immoUserDefined u ON im.objektnr_extern = u.objektnr_extern WHERE 1 AND (u.field = 'user_interner_objekttyp' AND u.value IS NULL ) ORDER BY im.anbieternr='FI' DESC, im.eingestellt_um DESC LIMIT 0, 15
 
Moin DiDiJo,

versuch es mal so:
SQL:
 SELECT im.* 
		FROM immobilien im 
		LEFT JOIN (
		 select objektnr_extern, value 
		   FROM immoUserDefined
		   WHERE field='user_interner_objekttyp') u 
		   ON im.objektnr_extern = u.objektnr_extern 
        where u.value IS NULL
		ORDER BY im.anbieternr='FI' DESC
		       , im.eingestellt_um DESC LIMIT 0, 15

Grüße
Biber
 
zuerst mal eine kleine Empfehlung
PHP SQL-Statement in PHP lesbar darstellen
Zum Thema
Entweder so wie Biber2 es schreibt, oder als Subquery im WHERE
SQL:
SELECT 
    im.* 
FROM 
    immobilien im 
WHERE 
    u.objektnr_extern NOT IN (
        SELECT 
            u.objektnr_extern 
        FROM 
            immouserdefined u 
        WHERE 
            u.`field` = 'user_interner_objekttyp'
    )
 
Zuletzt bearbeitet von einem Moderator:
Hi, danke schonmal für die Antworten.

Die letzte Variante per Subquery hatte ich eingebaut; das hat aber dafür gesorgt, dass der Select unglaublich langsam wurde. Deshalb wollte ich das ganze per JOIN lösen. Die erste JOIN Variante die hier genannt wurden ist: Ist diese performanter als ein normaler Subquery ?! Es sieht mir als "Leihe" wie ein Misch-Masch aus 2 Varianten aus

mfg DiDi
 
Ich zitiere mich dazu mal selber.
Performance-Verbesserungen sind keine eindeutige und einfache Sache. Es ist ein testen und heran tasten. Auswerten von Explainplans, SQL umschreiben - ggf. total umschreiben, weiter testen, Anzahl Datensätze der Tabelle vergleichen, ggf. Subqueries machen um die Datenmenge so früh wie möglich klein zu kriegen etc.
Also, so einfach *schnipp*und ein SQL ist schnell - das kannst du vergessen. Diese ganzen Punkte die ich aufgezählt habe gehen auch nicht einfach so mit im Forum hin und her schreiben. Lies dich in das Thema ein. Verscuh es zu verstehen. Und dann setz dich hin und probier dich durch.

Ergo, probiers aus.
 
Moin,

ohne jetzt die relationale Algebra bemühen zu wollen, ist ein JOIN zweier Tabellen rechnerisch sehr aufwendig. Allerdings joine ich relativ munter in meiner Webanwendung eine Tabele mit knapp 20.000 Einträgen mit einer Tabelle mit etwa 1.300 Einträgen und zusätzlich mit eine Tabelle mit etwa 60 Einträgen. Die Anfrage wird innerhalb kürzester Zeit berechnet, so dass ich auf der Website keine nennenswerte Verzögerung feststellen kann.

Das kann aber mit dem Webspace / dem Server zusammenhängen, ich selbst habe einen vServer im Einsatz. Wenn es also bei dir ein Problem darstellt, mag ein Wechsel auf ein leistungsstärkeres Produkt halfen, wenn dies nicht möglich oder nicht gewünscht ist, muss man sparsam mit den Ressourcen umgehen. Dabei hilft unter Umständen folgendes:

  1. Die oben genannten Subqueries. Wenn du MySQL nutzt, zum Beispiel dieses:
    http://dev.mysql.com/doc/refman/5.1/de/exists-and-not-exists-subqueries.html
  2. Die Nutzung von mysqli anstatt mysql in php (sofern php benutzt wird, ansonsten einen performantere Brücke)
  3. Dann gibt es noch ein paar Performancebringer in Form von Prepared Statements, Views oder ähnlichem, ist je nach DB unterschiedlich
  4. Außerdem kann die richtige Indizierung deiner Tabelle helfen, Felder anhand derer häufig selektiert wird, sollten indziert werden, um die Performanz zu erhöhen

Ich hoffe die Liste hilft dir bei einer Problemlösung.
 
Zurück