WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   MySQL Frage: FullJoin 2er Tabellen, Reihenfolge abhängig? (http://www.wcm.at/forum/showthread.php?t=246959)

mankra 15.10.2013 00:04

MySQL Frage: FullJoin 2er Tabellen, Reihenfolge abhängig?
 
Fragen an die DB Experten:
Sollte bei einem Fulljoin nicht die Reihenfolge der Tabellen egal sein?

Warum funtioniert dieses Beispiel nicht (Keine Fehlermeldung, es werden aber nur 0 Datensätze ausgegeben).

Code:

SELECT
  t.text_title,
  t.text_key,
  t.text_group,
  t.field,
  tts.text
FROM text t, text_to_stores tts
where
  t.status = 1
  and tts.key = t.text_key
  and tts.store_id = 101
order by t.sort

Und das hier funktioniert (Die 12 Datensätze werden richtig ausgegeben):

Code:

SELECT
  t.text_title,
  t.text_key,
  t.text_group,
  t.field,
  tts.text
FROM text_to_stores tts, text t
where
  t.status = 1
  and tts.key = t.text_key
  and tts.store_id = 101
order by t.sort

Der einzige Unterschied ist, wie die Reihenfolge der Tabellen.
Kann mir jemand eine Erklärung dazu geben?
Hab mit dem Blödsinn ne Stunde versch...en.

pc.net 15.10.2013 00:37

lies dir mal die mysql-referenz zu join durch ;)

http://dev.mysql.com/doc/refman/5.1/de/join.html
http://dev.mysql.com/doc/refman/5.1/...imization.html

mankra 15.10.2013 00:43

Kenn ich natürlich, weiß jetzt nicht, wonach ich suchen sollte.
Bei dieser Schreibweise handelt es sich ja um ein Full-Join.
Bei nem Outer Join, wärs schon klar (oder auch nicht, wenn ich jetzt so nachdenk, da ich sowieso nur die Datensätze brauch, wo es volle Datensätze gibt).
Ich verstehe nicht, warum Beispiel eins 0 Zeilen als Ergebniss erzeugt.

pc.net 16.10.2013 11:51

ich beziehe mich auf diesen punkt der doku:

Zitat:

Der Join-Optimierer berechnet die Reihenfolge, in der die Tabellen verknüpft werden sollten. Die durch LEFT JOIN oder STRAIGHT_JOIN erzwungene Lesereihenfolge für die Tabellen unterstützt den Join-Optimierer bei seiner Arbeit wesentlich effizienter, weil erheblich weniger Tabellenumstellungen zu überprüfen sind.
der mysql-optimierer kommt hier wohl durcheinander ...



was mir noch einfallen würde:
probier als erste die verbindungs-bedingung zw. den beiden tabellen ... dadurch sollte der optimizer beim parsen des statements jedenfalls zuerst erkennen, dass er beide tabellen für ein korrektes ergebnis verbinden sollte ;) ... dann sollte die reihenfolge der tabellen auch unerheblich sein ...
nebenbei macht das so ein statement auch leichter lesbar - vor allem bei umfangreichen abfragen mit vielen tabellen hilft das sehr ...

mankra 16.10.2013 11:55

Also

Code:


SELECT
....
FROM text t, text_to_stores tts
where
  tts.key = t.text_key
  and t.status = 1
  and tts.store_id = 101

Bringt keine Änderung, 0 Ergebnisse.

mankra 16.10.2013 11:59

Aber jetzt hab ichs:

Mit

Code:


FROM `text` t, text_to_stores tts

Klappt es.

D.h. kein Logigfehler, sondern "nur", daß die DB den Tabellen Namen text als Schlüsselwort interpretiert.
Ohne Fehlermeldung hab ich an dies nicht gedacht.

pc.net 17.10.2013 00:17

solch triviale fehler sind immer wieder witzig :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag