Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

[Hilfe]Sql funktion

Dieses Thema im Forum "Allgemeine Diskussionen" wurde erstellt von Noa1990, 9 Mai 2013.

  1. Noa1990

    Noa1990 Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

    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?
     
  3. ukulele

    ukulele Datenbank-Guru

    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.
     
  4. Noa1990

    Noa1990 Benutzer

    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
     
  5. akretschmer

    akretschmer Datenbank-Guru

    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?
     
  6. ukulele

    ukulele Datenbank-Guru

    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.
     
  7. Noa1990

    Noa1990 Benutzer

    PHP:
    mysqlselect type,time,who,how FROM log.log;
    +-----------+---------------------+-------+----------+
    type      time                who  how      |
    +-----------+---------------------+-------+----------+
    CHARACTER 2013-05-09 13:12:15 58019 LOGIN    58019Spieler 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 | -dhist immernoch Online)
    CHARACTER 2013-05-10 14:37:16 57906 LOGIN    |
    CHARACTER 2013-05-10 15:15:05 57906 LOGOUT  |
    +-----------+---------------------+-------+----------+
     
    mysqlselect 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 |58019Gildenleader 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..
     
  8. Tommi

    Tommi Datenbank-Guru

    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
     
  9. Noa1990

    Noa1990 Benutzer

    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
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Tabellen-Aliase

    Die Select-Liste in diesem Fall.

    Ähm, einklich Grundlagenwissen, oder?
     
  11. Noa1990

    Noa1990 Benutzer

    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
     
  12. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden