Probleme mit SQL Befehl

  • Hi Leute,

    Ich versuche mich gerade an einer Abfrage und scheitere scheinbar an einer einfachen Sache.

    PHP
    /* ############## SPIELERARTEN ANFANG ########### */
       $username = $db->query("SELECT username, userid FROM bb".$n."_groups LEFT JOIN bb".$n."_users ON userid=userid 
    WHERE groups=groupid=9");
     /* ############## SPIELERARTEN ENDE ########### */

    Als Fehlermeldung bekomme ich zurück, dass "groups" keine gültige Spalte in der WHERE-Klausel ist

    Ich habe auch zwei Screens angehangen von der Tabelle Gruppe und User hab ich vielleicht dort einen Fehler oder ist mein Code einfach Falsch? Mit $username will ich in einer entsprechenden Datei die Namen aus der Gruppe ausgeben lassen, die ich versuche aufzurufen.

    Liebe grüße

  • Die EXAKTE Fehlermeldung als copy/paste wäre besser.

    1. "groups=groupid=9" - Was soll das denn sein? Du kannst nicht 3 Werte auf einmal vergleichen. Davon abgesehen sieht man auf deinem Screenshot der User-Tabelle auf keine Spalte `groups`.
    2. Dein Datenbankdesign scheint mir stark verbesserungswürdig. Wenn ich das richtig sehe, hast du in deiner `groups`-Tabelle für jedes Recht eine eigene Spalte angelegt. Das löst man sauber über eine zweite Tabelle in der die Rechte abgelegt werden, und eine dritte Foreign-Key-Tabelle in der die Rechte den Gruppen zugeordnet werden. Ist doch ne Katastrophe wenn du jedesmal wenn ein neues Recht dazukommt eine neue Spalte in deiner Groups-Tabelle anlegen und neue Queries schreiben musst.
    3. Deine ON-Klausel für den LEFT JOIN kann nicht funktionieren. Sollten tatsächlich beide Tabellen eine Spalte userid haben, so käme die Fehlermeldung "`userid` is ambigious".

    Sag doch mal was du überhaupt bezwecken willst. Ich habe aber das starke Gefühl, dass du vielleicht erst mal noch ein SQL-Tutorial durchackern solltest, mindestens eins zum Thema JOINS. Stichwort: Aliase für Tabellennamen.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Hallo, die Datenbank ist mit der Installation erstellt worden wozu das Forums gehört. Ich habe diese nicht selber angelegt. So zur groupid=9 das ist die ID von der Gruppe wo ich die User gerne von haben möchte (also die Namen der User die in dieser Gruppe sind).
    Die Fehlermldung sieht so aus:

    Code
    [FONT=Verdana][size=10][B]SQL-DATABASE ERROR[/B]
    
    
    [B]Database error in WoltLab Burning Board:[/B] Invalid SQL: SELECT username, userid FROM bb1_groups LEFT JOIN bb1_users ON userid=userid  WHERE groupid=9 
    [B]mysql error:[/B] Column 'groupid' in where clause is ambiguous 
    [B]mysql error number:[/B] 1052 
    [B]Date:[/B] 19.08.2011 @ 23:26 
    [B]Script:[/B] /statistik.php 
    [B]Referer:[/B]  
    [/SIZE][/FONT]


    Ah okay, wenn es mit dem LEFT JOIN nicht geht nur mit

    Code
    [FONT=Verdana][size=10]$username_angel = $db->query("SELECT username, userid, groupid FROM bb".$n."_users WHERE groupid=9");[/SIZE][/FONT]

    geht es auch nicht da bekomme ich dann ausgegegeben angezeigt

    Code
    [FONT=Tahoma][size=8][FONT=Tahoma][size=8]Resource id #97[/SIZE][/FONT][/SIZE][/FONT]

    EDIT: Ich habe in der PHP Datei auch noch andere Abfragen drin die es ja ohne Probleme tun. Wo mir von den Gruppen, die es gibt die Anzahl ausgegeben wird wieviele sich in der Gruppe befinden. Nur jetzt wollte ich versuchen an die Usernamen zu kommen.

    LG

    Einmal editiert, zuletzt von CSB (19. August 2011 um 23:35)

  • Hallo, die Datenbank ist mit der Installation erstellt worden wozu das Forums gehört. Ich habe diese nicht selber angelegt. So zur groupid=9 das ist die ID von der Gruppe wo ich die User gerne von haben möchte (also die Namen der User die in dieser Gruppe sind).
    Die Fehlermldung sieht so aus:

    Code
    [FONT=Verdana][size=10][B]SQL-DATABASE ERROR[/B]
    
    
    [B]Database error in WoltLab Burning Board:[/B] Invalid SQL: SELECT username, userid FROM bb1_groups LEFT JOIN bb1_users ON userid=userid  WHERE groupid=9 
    [B]mysql error:[/B] Column 'groupid' in where clause is ambiguous 
    [B]mysql error number:[/B] 1052 
    [B]Date:[/B] 19.08.2011 @ 23:26 
    [B]Script:[/B] /statistik.php 
    [B]Referer:[/B]  
    [/SIZE][/FONT]


    Die Fehlermeldung besagt, dass es in deiner Abfrage mindestens zwei Tabellen gibt, die eine Spalte 'groupid' haben. Daher musst du in der Abfrage genau angeben auf welches 'groupid' aus welcher Tabelle du dich beziehst. Das machst du indem du in deiner Abfrage statt `groupid` dann `tabellenname`.`groupid` schreibst.
    Du kannst für den Tabellennamen natürlich auch ein Alias vergeben, Beispiel:

    SQL
    SELECT     t1.field,t2.field FROM     table1 AS t1    INNER JOIN        table2 AS t2 ON t2.table1_id=t1.id
    Code
    [FONT=Verdana][size=10]$username_angel = $db->query("SELECT username, userid, groupid FROM bb".$n."_users WHERE groupid=9");[/SIZE][/FONT]

    geht es auch nicht da bekomme ich dann ausgegegeben angezeigt

    Code
    [FONT=Tahoma][size=8][FONT=Tahoma][size=8]Resource id #97[/SIZE][/FONT][/SIZE][/FONT]


    Ja, query() gibt dir auch nur einen Verweis auf die Resource zurück, in der die Ergebnisse abgelegt sind. Du musst die aber noch von dort abholen. Je nachdem was für eine Datenbankklasse du verwendest sieht das anders aus.
    Bei mysqli z.B.

    PHP
    $res = $db->query("SELECT username, userid, groupid FROM bb".$n."_users WHERE groupid=9");
    while( $row = $res->fetch_assoc() ) {
        echo "<pre>",print_r($row, 1),"</pre>";
    }

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    Einmal editiert, zuletzt von SinnlosS (25. August 2011 um 19:30)