INNER JOIN Problem - Dringend
Michael
- datenbank
Ich bin echt am Ende. Ich verstehe es einfach nicht ! Könnt ich mir sagen was daran falsch ist.
Hier ist die SQL Anweisung und die Fehlermeldung:
SELECT Artikel.JJMNr, Artikel.TextA FROM Artikel INNER JOIN mlm ON
Artikel.ID=mlm.IDlink LIMIT 0,30
You have an error in your SQL syntax near 'ON Artikel.ID=mlm.IDlink LIMIT 0,30' at line 1
Ich benutze Version MySQL 3.22.32, PHP4, Linux ! Mit LEFT OUTER JOIN funkioniert es, ich will auch nicht beide Tabellen in die FROM Anweisung mit aufnehmen und dann per WHERE Anweisung anfragen (z.B. FROM Artikel, mlm WHERE Artikel.ID = mlm.IDLink) ! SO nicht. Es sind mehrere JOIN Verknüfungen ineinander verschachtelt und es sind ca 400000 Datensätze.
Vielen Dank im voraus
Hallo,
es kann daran legen, dass "inner" ein Access-Atribute ist und SQL
problemme damit hat. Nimm inner weg. Es funktioniert auch ohne.
Sag mal Bescheid.
Sohail
Hallo,
es kann daran legen, dass "inner" ein Access-Atribute ist und SQL
problemme damit hat. Nimm inner weg. Es funktioniert auch ohne.Sag mal Bescheid.
Sohail
Leider Nein, da kommt genau die gleiche Fehlermeldung. Trotzdem Danke !
Hallo nochmal,
ich weiß nicht warum du nicht von "WHERE" gebreuch nehmen willst. Es kann sein, dass LIMIT an dieser Stelle nicht so funktioniert, wie du es dir vorstellst(die Anweisung weiß nicht, welche tabelle oder welches Feld LIMITIERT werden muß, da ihr ARTIKEL. oder mlm. fehlt). Ich weiß nicht, wie deine Tabellen aufgebaut sind, aber du kannst auch über WHERE auch deine ABFRAGE richtig ausführen:
wenn z.B. das Feld, das du limitieren willst preis heißt und in Tabelle Artikel ist:
SELECT Artikel.JJMNr, Artikel.TextA FROM Artikel JOIN mlm ON
Artikel.ID=mlm.IDlink WHERE Artikel.preist <= 30
Sohail
Hallo nochmal,
ich weiß nicht warum du nicht von "WHERE" gebreuch nehmen willst. Es kann sein, dass LIMIT an dieser Stelle nicht so funktioniert, wie du es dir vorstellst(die Anweisung weiß nicht, welche tabelle oder welches Feld LIMITIERT werden muß, da ihr ARTIKEL. oder mlm. fehlt). Ich weiß nicht, wie deine Tabellen aufgebaut sind, aber du kannst auch über WHERE auch deine ABFRAGE richtig ausführen:
wenn z.B. das Feld, das du limitieren willst preis heißt und in Tabelle Artikel ist:
SELECT Artikel.JJMNr, Artikel.TextA FROM Artikel JOIN mlm ON
Artikel.ID=mlm.IDlink WHERE Artikel.preist <= 30Sohail
Das hab ich schon gemacht, nur habe ich 5 Tabellen die ineinander verschachtelt sind. Mit Datensätzen von 400000, 200000, 26000, 3000, 80000. Das dauert viel zu lange, leider ! Das LIMIT kommt sowieso weg !
Hi,
Das hab ich schon gemacht, nur habe ich 5 Tabellen die ineinander verschachtelt sind. Mit Datensätzen von 400000, 200000, 26000, 3000, 80000. Das dauert viel zu lange, leider !
wenn Du solche Datenmengen hast, dann nützt das einfach nur Hinschreiben einer SQL-Query in vielen Fällen nichts mehr. Dann solltest Du Dir einen Ausführungsplan machen.
Natürlich solltest Du vermeiden, Deine Tabellen voll miteinander auszumultiplizieren.
Bei einer "richtigen" Datenbank gibt es dazu viele Möglichkeiten, bei Oracle beispielsweise "hints".
In Deinem Falle könnte eine geeignete Indexstruktur über die Tabellen schon viel helfen - für Details müßte ich aber Deine gesamte Datenbankstruktur kennen und verstehen.
Dein Fall ist ein schönes Beispiel dafür, daß Datenbankdesign eben doch mehr ist als gutes DML, nämlich auch gutes DDL. Es besteht eine gute Chance, daß die Lösung Deines Problems *nicht* in dem entsprechenden SELECT-statement steckt, sondern in der Definition Deiner Tabellen.
mfG - Michael
Hi,
Das hab ich schon gemacht, nur habe ich 5 Tabellen die ineinander verschachtelt sind. Mit Datensätzen von 400000, 200000, 26000, 3000, 80000. Das dauert viel zu lange, leider !
wenn Du solche Datenmengen hast, dann nützt das einfach nur Hinschreiben einer SQL-Query in vielen Fällen nichts mehr. Dann solltest Du Dir einen Ausführungsplan machen.
- Wie hoch ist die individuelle Treffer-Quote Deiner Query in jeder der fünf Tabellen?
- Kannst Du die JOINs so sortieren, daß zunächst zwischen den Tabellen mit den wahrscheinlich geringsten Trefferzahlen geJOINt wird?
Natürlich solltest Du vermeiden, Deine Tabellen voll miteinander auszumultiplizieren.
Bei einer "richtigen" Datenbank gibt es dazu viele Möglichkeiten, bei Oracle beispielsweise "hints".
In Deinem Falle könnte eine geeignete Indexstruktur über die Tabellen schon viel helfen - für Details müßte ich aber Deine gesamte Datenbankstruktur kennen und verstehen.
Ich habe die Daten aus MSAccess2000. Die SQL Abfragen hab ich dort schon, klar ich kann die natürlich nicht 1:1 übernehmen. Aber die Abfragen dauern dort nur ein paar Sekunden.
Dein Fall ist ein schönes Beispiel dafür, daß Datenbankdesign eben doch mehr ist als gutes DML, nämlich auch gutes DDL. Es besteht eine gute Chance, daß die Lösung Deines Problems *nicht* in dem entsprechenden SELECT-statement steckt, sondern in der Definition Deiner Tabellen.
mfG - Michael
Hallo !
SELECT Artikel.JJMNr, Artikel.TextA FROM Artikel INNER JOIN mlm ON
Artikel.ID=mlm.IDlink LIMIT 0,30
...
Ich benutze Version MySQL 3.22.32 ...
Tja, da schaut man doch ins Handbuch ...
<cite>
----------------------------------------------------
MySQL supports the following JOIN syntaxes:
table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional-expr
table_reference LEFT [OUTER] JOIN table_reference USING (column-commalist)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{ table_reference LEFT OUTER JOIN table_reference ON conditional-expr }
----------------------------------------------------
</cite>
... und, siehe da, was findet sich nicht: INNER JOIN! ;-)
Einige sehr nützliche Hinweise zur Anwendung von JOINs findest du übrigens hier:
http://www2.rent-a-database.de/mysql/mysql-118.html
und auch :
http://www2.rent-a-database.de/mysql/mysql-127.html
Gruß,
kerki
Hallo Kerki
Leider lieg
... und, siehe da, was findet sich nicht: INNER JOIN! ;-)
Leider liegst Du falsch.
Schau mal, was sich in meinem MySQL-Manual findet:
<cite Quelle="MySQL Reference Manual" Version="3.23.8-alpha" Kapitel="7.13">
MySQL supports the following JOIN syntaxes for use in SELECT statements:
table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference INNER JOIN table_reference
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional_expr
table_reference LEFT [OUTER] JOIN table_reference USING (column_list)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr }
</cite>
Es stellt sich natürlich die Frage, mit welcher Version Michael arbeitet.
Mein MySQL-Server ist relativ frisch installiert (vor ca. 2-3 Wochen) und dürfte so recht aktuell sein, was aber nicht auf jedem Web-Server gegeben sein muss.
Auch das LIMIT ist eine erlaubte Funktion und die Syntax scheint zu passen.
Der einzige Fehler (den ich nach meinem Versionsstand sehen kann) ist, dass die Tabellennamen oder Spaltennamen falsch sind.
Ist aber unwahrscheinlich, da dasselbe Statement in Access 2000 läuft.
Es bleiben für Michael also nur 2 Möglichkeiten:
Grüsse
Tom
Hallo !
... und, siehe da, was findet sich nicht: INNER JOIN! ;-)
...
Leider liegst Du falsch.
Schau mal, was sich in meinem MySQL-Manual findet:<cite Quelle="MySQL Reference Manual" Version="3.23.8-alpha" Kapitel="7.13">
MySQL supports the following JOIN syntaxes for use in SELECT statements:
...
table_reference INNER JOIN table_reference
...
Es stellt sich natürlich die Frage, mit welcher Version Michael arbeitet.
Die Frage stellt sich nicht!
Ich benutze Version MySQL 3.22.32,
Lt. MySQL Change History wird INNER JOIN erst ab Version 3.23.0 unterstützt.
Und das habe ich natürlich bei meinem Posting genauestens berücksichtigt! ;-))) (zumindest unterbewusst)
Es bleiben für Michael also nur 2 Möglichkeiten:
- MySQL auf dem Server upgraden.
- Auf INNER-JOIN verzichten und mit geeigneten WHERE-Verknüpfungen und Indizes eine performante Abfrage zusammenbauen.
Und eben mit anderen JOINS. Wie von Michael Schröpl bereits eindringlich betont, ist bei einer derart großen Anzahl von Datensätzen über 5 Tabellen sehr schnell hängen-im-Schacht, wenn das kartesische Produkt zuschlägt:
oder: 499,2 Trilliarden !!!
Auf amerikanisch wäre es noch mehr. ;-) Leider versagt mein Langenscheidt hier völlig.
Gruß,
kerki
Wieder Hallo
<cite Quelle="MySQL Reference Manual" Version="3.23.8-alpha" Kapitel="7.13">
MySQL supports the following JOIN syntaxes for use in SELECT statements:
...
table_reference INNER JOIN table_reference
...
Es stellt sich natürlich die Frage, mit welcher Version Michael arbeitet.Die Frage stellt sich nicht!
Ich benutze Version MySQL 3.22.32,
Ich gebs ja zu: Ich hatte wieder mal Tomaten auf den Augen ;-(
Und eben mit anderen JOINS. Wie von Michael Schröpl bereits eindringlich betont, ist bei einer derart großen Anzahl von Datensätzen über 5 Tabellen sehr schnell hängen-im-Schacht, wenn das kartesische Produkt zuschlägt:
Man bedenke: 400.000
x 200.000
x 26.000
x 3.000
x 80.000= 499.200.000.000.000.000.000.000
oder: 499,2 Trilliarden !!!
yep!
Grüsse
Tom
Hallo!
Hab's recherchiert! :-)
http://www.lineone.net/dictionaryof/difficultwords/d0011822.html
Gaaanz viele Grüße,
kerki