SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

TYPO3 Kochbuch

TYPO3 Kochbuch zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #21  
Alt 19.10.2010, 15:01:10
nagel nagel ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 34
Beiträge: 15
AW: Left Join auf Select

hier ist der Explain, ich hab grade mal einen Index hinzugefügt, aber der wird nicht wirklich verwendet.

Code:
+----+--------------------+--------+--------+----------------------------------------------------------------------------------------+-----------------------------------+---------+-----------------------------------------------+------+-------------+
| id | select_type        | table  | type   | possible_keys                                                                          | key                               | key_len | ref                                           | rows | Extra       |
+----+--------------------+--------+--------+----------------------------------------------------------------------------------------+-----------------------------------+---------+-----------------------------------------------+------+-------------+
|  1 | PRIMARY            | tempMZ | ALL    | IndexIDAdresseVEVeWeTblMieterZuordnung                                                 | NULL                              | NULL    | NULL                                          | 7766 | Using where |
|  1 | PRIMARY            | tempA  | eq_ref | PRIMARY,indexIdAdresse,indexidAdressetblAdresse                                        | PRIMARY                           | 4       | wvs_wws_beta.tempMZ.idAdresse                 |    1 |             |
|  2 | DEPENDENT SUBQUERY | temp   | ref    | indexVetblmieterzurodnung,indexWetblMieterzurordnung,IndexVeWeLaufnrTblMieterZuordnung | IndexVeWeLaufnrTblMieterZuordnung | 10      | wvs_wws_beta.tempMZ.ve,wvs_wws_beta.tempMZ.we |    2 | Using where |
+----+--------------------+--------+--------+----------------------------------------------------------------------------------------+-----------------------------------+---------+-----------------------------------------------+------+-------------+
Mit Zitat antworten
  #22  
Alt 19.10.2010, 15:17:33
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Left Join auf Select

Der EXPLAIN zeigt, dass die Tabelle tempMZ komplett durchsucht wird. Das dauert natürlich etwas länger.

Generell: Wird ein Index nicht verwendet, dann bitte wieder entfernen.

Ich habe den SUB-Select mal umgeschrieben und hoffe er stimmt so..

Code:
SELECT tempmz.ve, 
       tempmz.we, 
       tempmz.kuendigungsdatum, 
       tempmz.kuendigungsgrund, 
       Concat(tempa.nachname, ", ", tempa.vorname) AS name, 
       tempa.tel 
  FROM tblmieterzuordnung tempmz 
  JOIN tbladresse tempa 
    ON tempmz.idadresse = tempa.idadresse 
  JOIN (SELECT ve, we, Max(TEMP.vertragsende) AS max_vertragsende
          FROM   tblmieterzuordnung
         WHERE vertragsende <> '1800-01-01' 
         GROUP BY ve, we
         ORDER BY NULL  ) temp 
    ON temp.ve = tempmz.ve 
   AND temp.we = tempmz.we
   AND temp.max_vertragsende = tempmz.vertragsende;
Wie sieht denn hiermit der EXPLAIN aus?

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #23  
Alt 19.10.2010, 15:29:33
nagel nagel ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 34
Beiträge: 15
AW: Left Join auf Select

Jap die Daten passen so, hier der Explain:

Code:
+----+-------------+--------------------+--------+-------------------------------------------------------------------------------------------------------------------------------+----------------------------------------+---------+-------------------------------+------+-------------------------------------------+
| id | select_type | table              | type   | possible_keys                                                                                                                 | key                                    | key_len | ref                           | rows | Extra                                     |
+----+-------------+--------------------+--------+-------------------------------------------------------------------------------------------------------------------------------+----------------------------------------+---------+-------------------------------+------+-------------------------------------------+
|  1 | PRIMARY     | <derived2>         | ALL    | NULL                                                                                                                          | NULL                                   | NULL    | NULL                          | 2196 |                                           |
|  1 | PRIMARY     | tempmz             | ref    | indexVetblmieterzurodnung,indexWetblMieterzurordnung,IndexVeWeLaufnrTblMieterZuordnung,IndexIDAdresseVEVeWeTblMieterZuordnung | IndexVeWeLaufnrTblMieterZuordnung      | 10      | temp.ve,temp.we               |    2 | Using where                               |
|  1 | PRIMARY     | tempa              | eq_ref | PRIMARY,indexIdAdresse,indexidAdressetblAdresse                                                                               | PRIMARY                                | 4       | wvs_wws_beta.tempmz.idAdresse |    1 |                                           |
|  2 | DERIVED     | tblMieterZuordnung | index  | NULL                                                                                                                          | IndexIDAdresseVEVeWeTblMieterZuordnung | 24      | NULL                          | 7766 | Using where; Using index; Using temporary |
+----+-------------+--------------------+--------+-------------------------------------------------------------------------------------------------------------------------------+----------------------------------------+---------+-------------------------------+------+-------------------------------------------+
Mit Zitat antworten
  #24  
Alt 19.10.2010, 15:40:13
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Left Join auf Select

Okay, aus meiner Sicht sollte der SUB-Select dann so schneller sein. Baue doch mal diesen SUB-Select für Vor- und Nachmieter entsprechend dem Beispiel um und in den Gesamt-Select ein.

Weiterhin fällt mir auf, das nirgend eine "echte" WHERE Klausel besteht. D.h. die Abfrage geht immer über den gesamten Datenbestand. Das ist vermutlich nicht realistisch.

Entsprechende "echte" WHERE Bedingungen sollten dann nicht nur im Gesamt-SELECT, sondern - wenn möglich - auch in den SUB-Select eingetragen werden. Damit die SUB-Select so wenig Daten wie möglich liefern.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #25  
Alt 19.10.2010, 16:03:00
nagel nagel ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 34
Beiträge: 15
AW: Left Join auf Select

Der Gesamt Select ist nun etwa 200ms schneller, wenn ich weitere spalten ausgeben lasse schnellt es aber wieder in die Höhe.

Zitat:
Weiterhin fällt mir auf, das nirgend eine "echte" WHERE Klausel besteht. D.h. die Abfrage geht immer über den gesamten Datenbestand. Das ist vermutlich nicht realistisch.
Genau, sie sollen aber nur über die ~360 Wohnungen aus dem ersten Select gehen, aber wie kann ich das realisieren?

Gruß
Mit Zitat antworten
  #26  
Alt 19.10.2010, 18:36:10
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Left Join auf Select

Zitat:
Zitat von nagel Beitrag anzeigen
Der Gesamt Select ist nun etwa 200ms schneller, wenn ich weitere spalten ausgeben lasse schnellt es aber wieder in die Höhe.
Je mehr Daten der SQL liefert, desto mehr Bytes müssen auch gelesen und transportiert werden. Also sollte die SELECT-Liste keine unnötigen Spalten enthalten.

Allgemein:
Wenn eine Tabelle z.B. 100 Datensätze hat und bei einem "SELECT * FROM " z.B. 80 davon gelesen werden, ist der Zugriff ohne Index schneller als mit. Da hat jede Datenbank so seine eigenen Grenzwerte.


Zitat:
Zitat von nagel Beitrag anzeigen
Genau, sie sollen aber nur über die ~360 Wohnungen aus dem ersten Select gehen, aber wie kann ich das realisieren?

Gruß
Was für "Wohnungen" sollen denn angezeigt werden? Irgendwelche Kriterien müssen ja zu finden sein. Beispielweise eine Bereichssuche nach Postleitzahl wäre sinnvoll.

Code:
..
WHERE plz BETWEEN 60000 AND 65000 ..
..
Bin noch am überlegen, was man noch schneller machen könnte.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #27  
Alt 20.10.2010, 14:57:22
nagel nagel ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 34
Beiträge: 15
AW: Left Join auf Select

Zitat:
Was für "Wohnungen" sollen denn angezeigt werden? Irgendwelche Kriterien müssen ja zu finden sein. Beispielweise eine Bereichssuche nach Postleitzahl wäre sinnvoll.
Der Select mit den Kriterien für die Wohnung stehen ja oben (ich glaub grade ich habe generell einen Fehler im Aufbau des Selects? )

Code:
(
SELECT W.idWohnung, MZ.idZuordnung,MZ.idAdresse,W.ve,W.we
FROM (tblWohnung W LEFT JOIN  tblMieterZuordnung MZ ON W.ve = MZ.ve AND W.we = MZ.we)
WHERE 
(MZ.Vertragsbeginn =
(SELECT MAX(temp.Vertragsbeginn)
FROM tblMieterZuordnung temp
WHERE temp.ve = W.ve AND temp.we = W.we) 
OR MZ.Vertragsbeginn IS NULL)

AND

((MZ.Vertragsende <> '1800-01-01'  AND MZ.Vertragsende < NOW()) OR MZ.Vertragsbeginn IS NULL OR (MZ.Vertragsende = '1800-01-01' AND MZ.Vertragsbeginn > NOW())) 

AND W.Altbestand = false
AND W.del = false

GROUP BY W.idWohnung
)

ich will ALLE Wohnungen und damit zusammenhängende Daten(tblAdresse,tblMieterZuordnung...) welche auf die Kriterien in diesem Select zutreffen.

Gruß
Mit Zitat antworten
  #28  
Alt 20.10.2010, 15:25:00
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Left Join auf Select

Zitat:
Zitat von nagel Beitrag anzeigen
Der Select mit den Kriterien für die Wohnung stehen ja oben (ich glaub grade ich habe generell einen Fehler im Aufbau des Selects? )


ich will ALLE Wohnungen und damit zusammenhängende Daten(tblAdresse,tblMieterZuordnung...) welche auf die Kriterien in diesem Select zutreffen.
Ob der SQL "sinnvoll" ist kann ich aufgrund der Datenmenge (siehe Deine #1 Mail mit dem Datenvolumen) und der Komplexität aus der Entfernung nicht entscheiden. Ich denke, dass sprengt die Möglichkeiten eines freiwilligen und kostenlosen Forums wie diesem hier.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #29  
Alt 21.10.2010, 09:27:02
nagel nagel ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 34
Beiträge: 15
AW: Left Join auf Select

Ja stimmt wohl, aber nochmal danke für deine Hilfe;)

Aber einmal noch um ganz sicher zu gehn:
Es ist nicht möglich in z.b.
Code:
SELECT *
FROM (Select ID FROM Tabelle WHERE ....) as Basis
LEFT JOIN (SELECT * FROM Tabelle2 WHERE....)
LEFT JOIN (SELECT * FROM Tabelle3 WHERE....)
Im zweiten und dritten Select nur die ID´s vom ersten Select zu nehmen?
Ich kann im WHERE des zweiten und dritten Selects ja nicht sagen "WHERE ID = Basis.ID".
Gibt es keine andere möglichkeit? Das würde das ganze problem glaub ich lösen.

Gruß
Mit Zitat antworten
  #30  
Alt 21.10.2010, 10:21:22
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Left Join auf Select

Anstatt

Code:
SELECT *
FROM (Select ID FROM Tabelle WHERE ....) as Basis
LEFT JOIN (SELECT * FROM Tabelle2 WHERE....)
LEFT JOIN (SELECT * FROM Tabelle3 WHERE....)

kannst Du ja mal so etwas probieren. Dann können die Werte aus der Basistabelle
als Grundlage für die weitere Suche herangezogen werden.

Code:
SELECT *
  FROM      (SELECT * 
               FROM Tabelle2 t2
               JOIN (Select ID FROM Tabelle WHERE ....) as Basis
                 ON t2.ID = Basis.ID) q1
  LEFT JOIN (SELECT * 
             FROM Tabelle3 t3
             JOIN (Select ID FROM Tabelle WHERE ....) as Basis
               ON t3.ID = Basis.ID) q2
    ON q2.xyz = q1.xyz
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
LEFT JOIN Problematik x_merlin_x MySQLi/PDO/(MySQL) 0 18.05.2010 11:49:18
Left Join sortieren? tsunamitsunami MySQLi/PDO/(MySQL) 2 04.05.2010 09:36:34
select * mit left join und case mattes74 MySQLi/PDO/(MySQL) 1 08.04.2010 12:36:58
Ausgabe wird nicht angezeigt Extremefall PHP Grundlagen 9 17.12.2009 08:49:45
IExplorer <-> Firefox + CSS rsciw HTML, CSS und JavaScript Help! 10 25.09.2006 16:06:34


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:11:41 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt