Michael: INNER JOIN Problem - Dringend

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

  1. 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

    1. 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 !

  2. 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

    1. 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

      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 !

      1. 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.

        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

        1. 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

  3. 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

    1. 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:

      • MySQL auf dem Server upgraden.
      • Auf INNER-JOIN verzichten und mit geeigneten WHERE-Verknüpfungen und Indizes eine performante Abfrage zusammenbauen.

      Grüsse
      Tom

      1. 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:

        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 !!!

        Auf amerikanisch wäre es noch mehr. ;-) Leider versagt mein Langenscheidt hier völlig.

        Gruß,
        kerki

        1. 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

          1. Hallo!

            Hab's recherchiert! :-)

            http://www.lineone.net/dictionaryof/difficultwords/d0011822.html

            Gaaanz viele Grüße,
            kerki