Lydia.h: MySQL, Bestellungen mit best. Artikel incl. aller Artikel

Hallo ihr Lieben,

mein Betreff hört sich kompliziert an, ist aber einfach.

Ich habe eine Tabelle Bestellungen, mit jeweils einem Datensatz pro Bestellung.
Dazu eine Artikel-Tabelle mit allen Artikeln, die zur Tabelle Bestellungen gehört:

Tabelle: Bestellung
Feld: BestID

Tabelle: Artikel
Feld: BestID

Problem
Jetzt suche ich alle Bestellungen mit einem bestimmten Artikel und möchte auch alle anderen Artikel der gefundenen Bestellungen anzeigen lassen.

In Access funktioniert das prima mit einer Unterabfrage:
SELECT Artikel.ArtikelID, Artikel.BestID
FROM Artikel
WHERE (((Artikel.BestID) In (SELECT BestID from Artikel where ArtikelID='12307')));

Aber MySQL macht das nicht.
Weiß jemand, wie das Statement sein muß, damit MySQL das selbe Ergebnis erzeugt?

  1. Hallo,

    bei Fragen zu MySQL ist es immer eine gute Idee, die verwendete Version anzugeben, da sich die Fähigkeiten von MySQL zwischen verschiedenen Versionen deutlich unterscheiden. Dies gilt ganz besonders für Dein Problem.

    In Access funktioniert das prima mit einer Unterabfrage:
    SELECT Artikel.ArtikelID, Artikel.BestID
    FROM Artikel
    WHERE (((Artikel.BestID) In (SELECT BestID from Artikel where ArtikelID='12307')));

    Aber MySQL macht das nicht.

    Selbstverständlich ist Dein SQL-Statement für MySQL überhaupt kein Problem, vorausgesetzt Du verwendest mindestens MySQL 4.1, da Subselects ab MySQL 4.1 unterstützt werden. Das läßt mich vermuten, dass Du eine ältere Version von MySQL verwendest. Es wäre für Deine potentiellen Helfer weiterhin hilfreich, die Fehlermeldung zu wissen, die MySQL ausgibt.

    Dein Subselect sollte sich mit Hilfe eines Selfjoin umschreiben lassen:

    SELECT  
      a1.ArtikelID            -- verwende einen Alias für die Tabelle Artikel  
    FROM Artikel a1           -- da Du zweimal auf diese Tabelle zugreifst  
    INNER JOIN Artikel a2     -- und hier erneut einen Alias  
    ON a1.BestID = a2.BestID  -- Verknüpfe über die BestID  
    WHERE a2.ArtikelID = 12307
    

    sollte das gewünschte Ergebnis in MySQL < 4.1 liefern.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzent,
      lieben Dank für Deine Info.

      Die Fehlermeldung deutet auf eine 'falsche' Schreibweise hin:
      You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT BestID FROM Artikel ...'

      (Ist der Beginn der Unterabfrage, die ja in Klammern steht.)

      Die MySQL-Version gibt der Provider nicht bekannt, daher gehe ich von einer ziemlich aktuellen Version aus.

      Deine Unterabfrage stimmt jedenfalls, da bekomme ich, was ich will :-)
      Allerdings würde mich schon interessieren, warum die Unterabfrage nicht geht.

      Auf jeden Fall schon mal einen lieben Dank an Dich!

      Ly.

      Hallo,

      bei Fragen zu MySQL ist es immer eine gute Idee, die verwendete Version anzugeben, da sich die Fähigkeiten von MySQL zwischen verschiedenen Versionen deutlich unterscheiden. Dies gilt ganz besonders für Dein Problem.

      In Access funktioniert das prima mit einer Unterabfrage:
      SELECT Artikel.ArtikelID, Artikel.BestID
      FROM Artikel
      WHERE (((Artikel.BestID) In (SELECT BestID from Artikel where ArtikelID='12307')));

      Aber MySQL macht das nicht.

      Selbstverständlich ist Dein SQL-Statement für MySQL überhaupt kein Problem, vorausgesetzt Du verwendest mindestens MySQL 4.1, da Subselects ab MySQL 4.1 unterstützt werden. Das läßt mich vermuten, dass Du eine ältere Version von MySQL verwendest. Es wäre für Deine potentiellen Helfer weiterhin hilfreich, die Fehlermeldung zu wissen, die MySQL ausgibt.

      Dein Subselect sollte sich mit Hilfe eines Selfjoin umschreiben lassen:

      SELECT

      a1.ArtikelID            -- verwende einen Alias für die Tabelle Artikel
      FROM Artikel a1           -- da Du zweimal auf diese Tabelle zugreifst
      INNER JOIN Artikel a2     -- und hier erneut einen Alias
      ON a1.BestID = a2.BestID  -- Verknüpfe über die BestID
      WHERE a2.ArtikelID = 12307

      
      >   
      > sollte das gewünschte Ergebnis in MySQL < 4.1 liefern.  
      >   
      >   
      > Freundliche Grüße  
      >   
      > Vinzenz
      
      1. Hallo,

        bitte kein TOFU

        Die Fehlermeldung deutet auf eine 'falsche' Schreibweise hin:
        You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT BestID FROM Artikel ...'

        das deutet noch mehr darauf hin, dass Dir eine alte MySQL-Version zur Verfügung steht.

        Die MySQL-Version gibt der Provider nicht bekannt, daher gehe ich von einer ziemlich aktuellen Version aus.

        Frage MySQL :-)
        SELECT [link:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#id3071881@title=VERSION()] sollte Dir Aufschluss über die verwendete Version geben.

        Deine Unterabfrage stimmt jedenfalls, da bekomme ich, was ich will :-)

        Das ist zunächst das Wichtigste.

        Allerdings würde mich schon interessieren, warum die Unterabfrage nicht geht.

        Meine Glaskugel sagt mir, Deine MySQL-Version ist nicht so neu wie Du vermutest ...

        Freundliche Grüße

        Vinzenz

        1. Hallo Vinz, (darf ich doch sagen, es gibt einen Spielfilm dazu :-)

          Meine Glaskugel sagt mir, Deine MySQL-Version ist nicht so neu wie Du vermutest ...

          Und die Glaskugel hat Recht: '4.0.27-standard-log' sagt Deine Abfrage. Ist das meine Schuld, oder die des Providers?

          Freundliche Grüße

          Vinzenz

          1. Hallo,

            Hallo Vinz, (darf ich doch sagen, es gibt einen Spielfilm dazu :-)

            wie lautet der Titel des Films, bitte?

            Meine Glaskugel sagt mir, Deine MySQL-Version ist nicht so neu wie Du vermutest ...

            Und die Glaskugel hat Recht: '4.0.27-standard-log' sagt Deine Abfrage. Ist das meine Schuld, oder die des Providers?

            Suche es Dir aus:

            [ ] Es ist die Schuld Deines Providers, da er keine neuere zur Verfügung stellt.
            [ ] Es ist Deine Schuld, weil Du Dir diesen Provider ausgesucht hast ...

            Freundliche Grüße

            Vinzenz