WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   SQL-Frage (MySQL) (http://www.wcm.at/forum/showthread.php?t=111196)

Gonte 06.10.2003 13:44

SQL-Frage (MySQL)
 
huhu leute!

ich hab da ein kleines problem, mit dem ich nicht zurecht komme, und hoffe auf eure hilfe.

ich habe eine tabelle, in der stehen u.a. die folgenden felder:

- id
- userid
- startdate als int (unix-timestamp)
- enddate als int (unix-timestamp)

zu einer person werden zeiten erfasst, d.h. von wann bis wann sie eingeloggt war bzw. ist. wenn sie gerade eingeloggt ist, befindet sich im letzten eintrag bei enddate ein NULL-wert.

jetzt will ich mit einem query rausfinden, was der letzte eingetragene datensatz ist, d.h. jener mit dem grössten startdate-timestamp und den dazu korresponierenden enddate-timestamp. das problem ist, dass letzterer auch NULL sein kann (wenn der user eben noch eingeloggt ist).

ich hoffe, ich habe das problem halbwegs verständlich beschrieben und dass mir jemand helfen kann.

danke im voraus ;)

JoergStueger 06.10.2003 16:11

Hallo!

Warum machst Du nicht ein SELECT MAX auf die Startdate? Wenn NULL drinnensteht kannst Du ja nen String á la "Ist noch angemeldet" ausgeben, oder versteh ich Dich falsch?

LG
Jörg

dreamer 06.10.2003 16:13

wenn ich das ganze richtig verstanden hab, könnte die abfrage so aussehen:

select id from tabelle order by startdate desc limit 0,1

= sortiert die tabelle absteigend noch startdate und gibt dir die id des datensatzes

käptn 06.10.2003 16:13

Re: SQL-Frage (MySQL)
 
Zitat:

Original geschrieben von Gonte
ich hoffe, ich habe das problem halbwegs verständlich beschrieben
http://www.mona-net.at/inc/img/forum/sm/nein.gif :)

~

_m3 06.10.2003 16:19

Und was ist das Problem bei der Abfrage?

Gonte 06.10.2003 16:30

ok, ich versuchs nochmal:

in der tabelle stehen von vielen usern jeweils viele login-daten. ich will zu jeder person den zugehörigen letzten record ausfindig machen (kein problem mit max(startdate) und group by personid). jedoch bräuchte ich dann zum startdate das zugehörige enddate und nicht irgendeines, sondern eben jenes das bei dem maximalen startdate drinnen steht.

weil wenn dieses enddate NULL ist, dann weiss ich ob der user angeloggt ist oder nicht.

z.b.

select personid, max(startdate), enddate
from table
group by personid

es soll dabei rauskommen:

person 1 mit letztem login um xxx und logout um xxx (oder eben NULL)

_m3 06.10.2003 16:45

ja und? kommt das nicht raus?
Was ist Dein Problem?

Gonte 06.10.2003 19:40

Zitat:

Original geschrieben von Gonte
jedoch bräuchte ich dann zum startdate das zugehörige enddate und nicht irgendeines, sondern eben jenes das bei dem maximalen startdate drinnen steht.
mit dem angegeben query bekomme ich zwar das richtige startdate, aber eben nicht das dazugehörige enddate, sondern jenes enddate des allerersten records.

also z.b.

...
person 1 startdate 1 enddate 1
person 1 startdate 2 enddate 2
person 1 startdate 3 enddate 3 (letzter eintrag person 1)
... weitere personen ...

der query liefert als ergebnis:

person 1 startdate 3 enddate 1 (!!!)

ich will aber enddate 3

_m3 06.10.2003 19:48

Code:

select personid, max(startdate), enddate
from table
where personid = BENUTZERID_DES_AKTUELLEN_BENUTZERS;

IMHO. :)

Gonte 06.10.2003 19:57

vielen dank für deine antwort _m3!

leider funktioniert dein vorschlag mal prinzipiell nicht, weil eine aggregatsfunktion wie max nur in einem select mit gruppierung vorkommen darf, wenn noch andere feldwerte ausgelesen werden.

zudem würde ich eine übersicht über alle personen benötigen, in dem sinn:

personid - letztes einlogdatum - dazugehöriges auslogatum
personid - letztes einlogdatum - dazugehöriges auslogatum
personid - letztes einlogdatum - dazugehöriges auslogatum
...

pc.net 06.10.2003 20:09

warum machst kein sub-select?
Code:

select t1.personid,
      t1.startdate,
      t1.enddate
from table t1
where t1.startdate = (select max(t2.startdate)
                      from table t2
                      where t2.personid = t1.personid)


Gonte 06.10.2003 20:14

leider befindet sich die mysql 4.1 noch in der alpha version (wodurch leider kein produktiv-einsatz möglich ist) und erst ab dieser version sind sub-selects möglich.

ich warte auf die 4.1er eh schon wie auf das christkindl :D

snowman 06.10.2003 21:39

Zitat:

Original geschrieben von dreamer
wenn ich das ganze richtig verstanden hab, könnte die abfrage so aussehen:

select id from tabelle order by startdate desc limit 0,1

= sortiert die tabelle absteigend noch startdate und gibt dir die id des datensatzes

und das geht nicht?

select personid, startdate, enddate from tabelle order by startdate desc limit 0,1

gruss,
snowman

jonix 06.10.2003 21:43

und folgendes geht auch net?
PHP-Code:

mysqlSELECT useridMAX(startdate), enddate
    
->        FROM table
    
->        GROUP BY userid 

da sollt doch nix dagegen sprechen oder?

Gonte 07.10.2003 08:35

vielen dank für eure antworten!

@snowman: dein vorschlag würde funktionieren, wenn ich nur eine person bräuchte, jedoch hätte ich gerne eine gruppierung nach personen, um eine online-liste aller personen zu erhalten.

@jonix: genau dieser query ist mein ausgangspunkt. jedoch erhalte ich bei diesem query als ergebnis NICHT das zum maximalen startdate korrespondierende enddate (d.h. jenes das im selben record steht), sondern einfach das des allerersten records, der zu dieser person in die datenbank eingefügt wurde. (worin ja genau mein problem besteht, da ich das korrespondierende enddate bräuchte)

snowman 07.10.2003 09:12

Zitat:

Original geschrieben von Gonte
@snowman: dein vorschlag würde funktionieren, wenn ich nur eine person bräuchte, jedoch hätte ich gerne eine gruppierung nach personen, um eine online-liste aller personen zu erhalten.
select personid, startdate, enddate from tabelle where enddate = 0 order by startdate desc

gruss,
snowman

jonix 07.10.2003 10:16

ok, jetzt versteh ich, sorry :-) ich versuchs nochmal:
PHP-Code:

SELECT userid,
       
SUBSTRINGMAXCONCAT(LPAD(starttime,10,'0'),endtime) ), 11) AS endtime,
       
0.00+LEFTMAXCONCAT(LPAD(starttime,10,'0'),endtime) ), 10) AS starttime
FROM   
`tabelle`
GROUP BY userid

streng nach vorschrift auf http://www.mysql.com/doc/en/example-...group-row.html

Gonte 07.10.2003 12:52

!!!!!!! ;)

very nice jonix & big thankx! das bringt mich einer lösung schon sehr sehr nahe! :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag