[Hilfe]Sql funktion

Noa1990

Benutzer
Beiträge
8
Hallo,
Ich würde gerne nur die namen in der tabelle1 bekommen die zuletzt online gewesen sind.
tabelle1: Tabelle
In Tabelle 2 werden sie geloggt jedoch gibt er mir 2 werte wieder
tabelle2: Tabelle
Es handelt sich um ein Spiel, wenn sich ein Spieler der eine Gilde besitzt und auch der Gildenleadr ist sich einloggt, wird es in der log.log tabelle eingetragen, der Gildenleader erkennt man an der Zahl in der tabelle player.guild spalte master.
Mein Problem ist, das ich nur die Namen der gilden angezeigt bekommt wenn auch der Gildenleader online ist. Hoffe ihr könnt mir helfen

Mfg. Noa

code: Console output
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.582
Generell kann man sagen das die Art und Weise wie die DB Daten speichert von der Anwendung abhängt. Ich kann aus den Daten nicht viel erkennen und glaube nicht das wir dir da groß helfen können. Gibt es keine Tabelle in der alle Gilden stehen auf die man sich beziehen kann? Um was für eine DB handelt es sich überhaupt?
 

ukulele

Datenbank-Guru
Beiträge
4.582
PS: SQL speichert nicht, welche Tabelle zuletzt (online?) aktiv war, es sei denn man baut sich so eine Funktion. Aber das halte ich für blödsinnig.
 

Noa1990

Benutzer
Beiträge
8
Danke für die schnelle Antwort.
Ich mache mal ein Beispiel...
Speiler Noa erstellt sich eine Gilde, somit ist er der Gildenleader, bei neuen Gilden werden Die Namen der Gilde in player.guild Gespeichert(siehe player.guild)master=Gildenleader ID, name=Name der Gilde.
In der Tabelle 1 Wird der Name der Gilde und die ID des Gildenleaders gespeichert(Die anderen werte Spielen keine große rolle).
Wenn sich Noa, also der Gildenleader einloggt, wird es in die log.log log.log gespeichert dort sieht man seine ID in die Spalte who, type ist der typ des Eintrages (CHARACTER=SPIELER), in der Spalte how Sieht man dann (bezogen auf dem typ) ob der Spieler sich eingeloggt hat oder nicht(Erkennt man an LOGIN oder LOGOUT), in der Spalte time sieht man die Uhrzeit wann der Eintrag gemacht wurden ist.

Was ich machen möchte ist, das im select alle Gilden Angezeigt werden wo ihre Gildenleader sich nicht Ausgeloggt haben, also nur die Gilden anzeigen bei denen der Gildenleader noch Online ist.
Code: MeinVorhabenAlsCode

Hoffe ihr könnt mir helfen,
alles Liebe Noa
 

akretschmer

Datenbank-Guru
Beiträge
9.423
Danke für die schnelle Antwort.
Ich mache mal ein Beispiel...

Ich auch:

Code:
test=*# select * from foo;
 spieler |             ts             | state
---------+----------------------------+--------
       1 | 2013-05-10 12:33:58.657225 | login
       1 | 2013-05-10 12:34:08.657225 | logout
       2 | 2013-05-10 12:34:10.657225 | login
       3 | 2013-05-10 12:34:11.657225 | login
       3 | 2013-05-10 12:34:13.657225 | logout
(5 rows)

Time: 0,171 ms
test=*# select * from (select distinct on (spieler) spieler, ts, state from foo order by spieler, ts desc) bla where state = 'login';
 spieler |             ts             | state
---------+----------------------------+-------
       2 | 2013-05-10 12:34:10.657225 | login
(1 row)

Ist es das, was Du suchst?
 

ukulele

Datenbank-Guru
Beiträge
4.582
Code:
SELECT    guild.name
FROM    guild
WHERE    guild.[master] IN (    SELECT    l1.who
                            FROM    [log] l1
                            WHERE    l1.how = 'LOGIN'
                            AND        NOT EXISTS (    SELECT    1
                                                    FROM    [log] l2
                                                    WHERE    l1.who = l2.who
                                                    AND        l1.[time] < l2.[time]
                                                    AND        l2.how = 'LOGOUT' ) )
Das ist ein Weg aber sicher noch optimierbar falls zu langsam.
 

Noa1990

Benutzer
Beiträge
8
PHP:
mysql> select type,time,who,how FROM log.log;
+-----------+---------------------+-------+----------+
| type      | time                | who  | how      |
+-----------+---------------------+-------+----------+
| CHARACTER | 2013-05-09 13:12:15 | 58019 | LOGIN    | 58019= Spieler Id
| CHARACTER | 2013-05-09 13:16:05 | 58019 | LOGOUT  |
| CHARACTER | 2013-05-09 13:23:29 | 58019 | LOGIN    |
| CHARACTER | 2013-05-09 13:42:06 | 58019 | LOGOUT  |
| CHARACTER | 2013-05-09 13:43:30 | 58019 | LOGIN    |58019 = letzter login um 2013-05-09 13:43:30 (kein logout vorhanden-
| CHARACTER | 2013-05-10 14:37:16 | 57906 | GM_LOGIN | -dh. ist immernoch Online)
| CHARACTER | 2013-05-10 14:37:16 | 57906 | LOGIN    |
| CHARACTER | 2013-05-10 15:15:05 | 57906 | LOGOUT  |
+-----------+---------------------+-------+----------+
 
mysql> select id,name,master from player.guild;
+-----+--------------+--------+
| id  | name        | master |
+-----+--------------+--------+
| 431 | SuperNatural |  57924 |
| 432 | HauDenLappen |  57920 |
| 433 | EternityTeam |  57905 |
| 434 | testgilde    |  57926 |
| 435 | GodsOfWaR    |  57937 |
| 436 | YouTube      |  57942 |
| 437 | Zwerge      |  57962 |
| 438 | WhoRainZone  |  57996 |
| 439 | Test        |  57949 |
| 440 | Doubletimez  |  58020 |
| 441 | MTGamings    |  58022 |
| 442 | TeamKakashi  |  58023 |
| 445 | Opfer        |  58019 |58019= Gildenleader von "Opfer" Gilde
+-----+--------------+--------+
Ich möchte das Wenn 58019= Spieler (als beispiel) Online ist, mit die Gilde Angezeigt wird.
Soll nur anzeigen, solage LOGIN und nicht LOGOUT der Letzte eintrag von dem Spieler ist.

PS: Danke für die Mühe..
 

Tommi

Datenbank-Guru
Beiträge
285
Hallo Noa,

der Optimierungs-Ansatz von ukulele sieht dann wie folgt aus:

Code:
SELECT [...]
FROM player.guild A
INNER JOIN log.log L
     ON A.master=L.who
     AND L.how='LOGIN'
     AND L.Type='CHARAKTER'
WHERE NOT EXISTS ( SELECT who
                                            FROM log.log V
                                            WHERE V.who=A.master
                                            AND V.how='LOGOUT'
                                            AND V.Type='CHARAKTER
                                            AND V.time>L.time)

Also eigentlich das Gleiche wie in der Lösung von ukulele, nur das ich das über einen JOIN gelöst habe, so dass man auch gleich die Angabe mit auswerten kann, wann genau der letzte Login festgehalten worden ist.

Viele Grüße,
Tommi
 

Noa1990

Benutzer
Beiträge
8
Danke für die mühe, leider habe ich kleine Probleme beim ablesen...
welche werte haben denn A,L und V?
und was bedeutet [...]?

Mfg Noa
 

Noa1990

Benutzer
Beiträge
8
Besitze fast kein Grundwissen, ich habe nur aus fertigen Funktionen gelernt, da ich die Funktionen in lua verwende und schreiben muss, habe ich nicht sehr viel Erfahrung in dem Gebiet.
Code:
mysql> SELECT [...]
    FROM player.guild A
    INNER JOIN log.log L
        ON A.master=L.who
        AND L.how='LOGIN'
        AND L.Type='CHARAKTER'
        WHERE NOT EXISTS ( SELECT who
            FROM log.log V
                WHERE V.who=A.master
                AND V.how='LOGOUT'
                AND V.Type='CHARAKTER
                AND V.time>L.time);
    ->
es kommt dann keine Meldung mehr
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.582
Tabellen Aliase sind (fast immer) notwendig wenn du die selbe Tabelle mehrfach verwenden willst aber auch nicht so schwer zu verstehen. Hinter 'CHARAKTER fehlt noch ein ' aber ansonsten sieht der Code syntaktisch richtig aus, keine Ergebnisse bedeutet also keine entsprechenden Datensätze.
 
Oben