Sebastian: Unknown table [...] in order clause

Hi,

ich arbeite derzeit an einem größeren Rechtesystem und habe dazu einen etwas komplexeren JOIN für meine MySQL Datenbankabfrage erstellt.

Das ganze funktioniert inzwischen auch schon perfekt, bis auf einen letzten Fehler, den ich selbst nach einiger Recherche im Internet noch nicht beheben konnte.

Hier erstmal mein SQL Befehl:

----------------------------------------------
SELECT DISTINCT u.id FROM Users u LEFT JOIN UsersCats uc ON (uc.user_id=u.id AND uc.cat_id='".CAT_ID."')
UNION ALL SELECT DISTINCT u.id FROM Users u LEFT JOIN UsersGroups ug ON (ug.user_id=u.id) LEFT JOIN GroupsCats gc ON (gc.group_id=ug.group_id AND gc.cat_id='".CAT_ID."')
ORDER BY u.status DESC,u.lastname ASC
----------------------------------------------

Als Fehler bekomme ich nun folgenden angezeigt:
Unknown table 'u' in order clause

Meines Wissen ist der ORDER BY-Syntax jedoch richtig und die angegebene Tabelle existiert auch (selbst wenn ich den Namen ausgeschrieben habe kommt der Fehler).
Sobald ich den ORDER BY-Teil aus dem Befehl entferne wird übrigens kein Fehler mehr angezeigt.

Hat jemand von euch eine Idee? Wäre echt toll, wenn sich das Problem lösen lassen würde ;)

  1. Hallo Sebastian,

    Das ganze funktioniert inzwischen auch schon perfekt, bis auf einen letzten Fehler, den ich selbst nach einiger Recherche im Internet noch nicht beheben konnte.

    Hier erstmal mein SQL Befehl:

    Ich vermute, das folgende ist eine Anweisung einer Programmiersprache. Was ist  CAT_ID?

    SELECT DISTINCT u.id FROM Users u LEFT JOIN UsersCats uc ON (uc.user_id=u.id AND uc.cat_id='".CAT_ID."')
    UNION ALL SELECT DISTINCT u.id FROM Users u LEFT JOIN UsersGroups ug ON (ug.user_id=u.id) LEFT JOIN GroupsCats gc ON (gc.group_id=ug.group_id AND gc.cat_id='".CAT_ID."')
    ORDER BY u.status DESC,u.lastname ASC

    Weiterhin hast Du vergessen anzugeben, mit welchem Datenbankmanagementsystem Du arbeitest. Es könnte dBase sein, DB2, Informix, Access, FoxPro, MS SQL-Server, Oracle, PostgreSQL, ...

    Ich vermute, Du verwendest MySQL.

    Als Fehler bekomme ich nun folgenden angezeigt:
    Unknown table 'u' in order clause

    Meines Wissen ist der ORDER BY-Syntax jedoch richtig

    Nein. Nicht in MySQL.

    und die angegebene Tabelle existiert auch (selbst wenn ich den Namen ausgeschrieben habe kommt der Fehler).

    Logisch, das steht auch so im Handbuch.

    Sobald ich den ORDER BY-Teil aus dem Befehl entferne wird übrigens kein Fehler mehr angezeigt.

    http://dev.mysql.com/doc/refman/5.0/en/union.html sagt Dir, warum:

    <zitat>
    To use an ORDER BY or LIMIT clause to sort or limit the entire UNION result, parenthesize the individual SELECT statements and place the ORDER BY or LIMIT after the last one. The following example uses both clauses:

    (SELECT a FROM t1 WHERE a=10 AND B=1)
    UNION
    (SELECT a FROM t2 WHERE a=11 AND B=2)
    ORDER BY a LIMIT 10;
    </zitat>

    Ich sehe keine Klammern

    <zitat>
    This kind of ORDER BY cannot use column references that include a table name (that is, names in tbl_name.col_name format). Instead, provide a column alias in the first SELECT statement and refer to the alias in the ORDER BY. (Alternatively, refer to the column in the ORDER BY using its column position. However, use of column positions is deprecated.)

    Also, if a column to be sorted is aliased, the ORDER BY clause must refer to the alias, not the column name. The first of the following statements will work, but the second will fail with an Unknown column 'a' in 'order clause' error:

    (SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b;
    (SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;
    </zitat>

    Ich sehe keine Spaltenaliasnamen.

    Freundliche Grüße

    Vinzenz

    1. Ah, super, vielen Dank.

      Leider arbeite ich noch nicht so lange mit JOINs und kenne diese Klammerregelungen etc. noch nicht wirklich.

      Jetzt klappt es jedenfalls wunderbar, nochmals danke für deine Hilfe!

      Viele Grüße,

      Sebastian