LinuxUser: Gleiche Spalte mit zwei verschiedenen WHERE's abfragen

Hallo!

Ich bin dabei ein Board zu programmieren, bei dem in der Themenübersicht nicht nur der Name des Themenstellers angezeigt wird, sondern auch der Name des Users, der zuletzt darauf geantwortet hat.
Nun sind beide Namen nur als ID abgelegt, da diese zur späteren Verarbeitung noch benötigt wird. Die Werte heißen btopics.topicstarter und btopics.lastanswer .

Nun soll zu jeder ID der Username abgefragt werden. Bei einem Namen ist dies zwar mit "WHERE users.username=btopics.topicstarter" einfach zu realisieren, bei zwei Namen scheitere ich allerdings, da ein "WHERE users.username=btopics.lastanswer" ebenfalls auf den Usernamen zugreift und für die Datenbank nun nicht mehr ersichtlich ist, welcher Name ausgegeben werden soll.

Ich habe bereits versucht, dieses Problem mit Hilfe von "AS" zu lösen, jedoch brachte mir auch dies keinen Erfolg.

Für Hilfe bin ich sehr dankbar,
LinuxUser

P.S.: Bitte verzeiht den unglücklich gewählten Themennamen, aber eine bessere Umschreibung fiel mir leider nicht ein.

  1. Hallo LinuxUser,

    Ich habe bereits versucht, dieses Problem mit Hilfe von "AS" zu lösen,

    Dies ist der korrekte Lösungsweg.

    jedoch brachte mir auch dies keinen Erfolg.

    Woran bist Du gescheitert?

    Viele Grüße,
    Christian

    1. Hallo LinuxUser,

      Hallo Christian!

      Ich habe bereits versucht, dieses Problem mit Hilfe von "AS" zu lösen,
      Dies ist der korrekte Lösungsweg.

      Sehr gut. :)

      jedoch brachte mir auch dies keinen Erfolg.
      Woran bist Du gescheitert?

      Gescheitert bin ich an der Anordnung der "AS"-s. Wenn ich diese an den Anfang der Abfrage setze, bspw. "SELECT users.username AS a, users.username AS b ...", dann erhalte ich zwar zweimal den Namen, jedoch zweimal den gleichen. Um nun die unterschiedlichen Namen zu erhaten, müssen a und b nun auch noch hinter die WHERE-Clausel. Dort standen sie jedoch bei mir nicht zur Verfügung und erzeugten eine MySQL-Fehlermeldung.

      Auch auf mysql.com (http://www.mysql.com/doc/en/SELECT.html) fand ich leider keine nützlichen Tipps hierzu.

      Viele Grüße,
      Christian

      Viele Grüße,
      LinuxUser

      Weitere Anregungen sind gerne willkommen.

      1. Hallo LinuxUser,

        Gescheitert bin ich an der Anordnung der "AS"-s. Wenn ich diese an den Anfang der Abfrage setze, bspw. "SELECT users.username AS a, users.username AS b ...", dann erhalte ich zwar zweimal den Namen, jedoch zweimal den gleichen. Um nun die unterschiedlichen Namen zu erhaten, müssen a und b nun auch noch hinter die WHERE-Clausel. Dort standen sie jedoch bei mir nicht zur Verfügung und erzeugten eine MySQL-Fehlermeldung.

        Aha, da haben wir den Fehler. Du musst das AS auf Tabellennamen anwenden. Hier mal ein Beispiel:

        -------------------------- schnipp --------------------------------------
        mysql> create table tmp1 (
            -> id int not null primary key auto_increment,
            -> name varchar(20)
            -> );
        Query OK, 0 rows affected (0.02 sec)

        mysql> create table tmp2 (
            -> id1 int not null,
            -> id2 int not null,
            -> data varchar(20)
            -> );
        Query OK, 0 rows affected (0.00 sec)

        mysql> insert into tmp1 (name) values ('test1');
        Query OK, 1 row affected (0.00 sec)

        mysql> insert into tmp1 (name) values ('test2');
        Query OK, 1 row affected (0.00 sec)

        mysql> insert into tmp1 (name) values ('test3');
        Query OK, 1 row affected (0.00 sec)

        mysql> insert into tmp1 (name) values ('test4');
        Query OK, 1 row affected (0.00 sec)

        mysql> select * from tmp1 ;
        +----+-------+
        | id | name  |
        +----+-------+
        |  1 | test1 |
        |  2 | test2 |
        |  3 | test3 |
        |  4 | test4 |
        +----+-------+
        4 rows in set (0.00 sec)

        mysql> insert into tmp2 (id1, id2, data) values (1, 2, 'test');
        Query OK, 1 row affected (0.00 sec)

        mysql> insert into tmp2 (id1, id2, data) values (3, 2, 'alpha');
        Query OK, 1 row affected (0.00 sec)

        mysql> insert into tmp2 (id1, id2, data) values (2, 4, 'beta');
        Query OK, 1 row affected (0.00 sec)

        mysql> select a.name as name1, b.name as name2, c.data as data from tmp1 as a, tmp1 as b, tmp2 as c where a.id = c.id1 and b.id = c.id2 ;
        +-------+-------+-------+
        | name1 | name2 | data  |
        +-------+-------+-------+
        | test1 | test2 | test  |
        | test3 | test2 | alpha |
        | test2 | test4 | beta  |
        +-------+-------+-------+
        3 rows in set (0.00 sec)

        -------------------------- schnapp --------------------------------------

        Das hilft Dir hoffentlich weiter.

        Viele Grüße,
        Christian

        1. Hallo LinuxUser,

          Hallo Christian!

          mysql> select a.name as name1, b.name as name2, c.data as data from tmp1 as a, tmp1 as b, tmp2 as c where a.id = c.id1 and b.id = c.id2 ;
          +-------+-------+-------+
          | name1 | name2 | data  |
          +-------+-------+-------+
          | test1 | test2 | test  |
          | test3 | test2 | alpha |
          | test2 | test4 | beta  |
          +-------+-------+-------+
          3 rows in set (0.00 sec)

          Das hilft Dir hoffentlich weiter.

          Vielen Dank!
          Das ist genau das, was ich gesucht habe und nun funktioniert es wunderbar. :)

          Viele Grüße,
          Christian

          Viele Grüße,
          LinuxUser