[PHP/MSSQL] Select statement

Pagina: 1
Acties:
  • 371 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Shockers
  • Registratie: April 2002
  • Laatst online: 14:43
Zit nu een dag te klote om in php een correct sql statement op te zetten. (php5 & mssql2000)

Het gaat om het volgende:

Ik wil alle gebruikers weergeven die op dat moment online zijn.

Dit wordt bijgehouden in een log tabel.
0 = gebruiker is online
1 = gebruiker is offline

Tabel structuur:

Login Gebruiker
0 Piet
1 Piet
0 Piet
0 Harry
1 Harry

(dan is piet nog online.)

Hoeveel er online zijn doe ik op deze manier:
code:
1
2
3
4
5
6
7
 $Query = $this->QueryDb( "SELECT * FROM LoginLog WHERE Login = '0'" );
        $row1 = mssql_num_rows( $Query );
        $Query = $this->QueryDb( "SELECT * FROM LoginLog WHERE Login = '1'" );
        $row2 = mssql_num_rows( $Query );
        $row = $row1 - $row2;
        
        echo "".$row."";


Nu wil ik dus weergeven wie er online is met bijbehorende naam.

Volgens mij is dan het beste om per gebruiker te kijken of zijn login waarde oneven is en vervolgens zijn gegevens te laten zien.

Iemand een idee hoe en incombinatie met php per gebruiker te zien of zijn waarde oneven is.

Acties:
  • 0 Henk 'm!

  • H004
  • Registratie: Maart 2006
  • Laatst online: 28-05 19:55
Het makkelijkst is denk ik om ook een timestamp in de tabel te plaatsen. Groepeer vervolgens op naam en selecteer dan de meest recente waarde.

[ Voor 2% gewijzigd door H004 op 16-12-2007 19:01 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Precies. Een dergelijke tabel zou imo alleen maar enigszins nut kunnen hebben met iets als timestamps. Zonder extra informatie kan je beter gewoon een enkele rij per user doen.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Afgezien van de vraag of dit de meest handige manier om je gegevens op te slaan, zou je dit kunnen doen:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
  w1.naam,
  (
    SELECT 
      online 
    FROM
      LoginLog w2 
    WHERE w1.naam = w2.naam 
    ORDER BY w2.id DESC 
    LIMIT 0, 1
  ) as online
FROM
  LoginLog w1
GROUP BY naam
ORDER BY naam

Acties:
  • 0 Henk 'm!

  • Shockers
  • Registratie: April 2002
  • Laatst online: 14:43
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$Query = $site->QueryDb("
SELECT
  w1.CharName,
  (
    SELECT 
      online 
    FROM
     db_log..WS_LoginLog w2 
    WHERE w1.CharName = w2.CharName 
    ORDER BY w2.CharName DESC 
    LIMIT 0, 1
  ) as online
FROM
  ".$dbtabel_sho_log."..WS_LoginLog w1
GROUP BY CharName
ORDER BY CharName
");
while ($ResQuery = mssql_fetch_array($Query))
{

Krijg daarop: Incorrect syntax near 'LIMIT'. (severity 15)

Zit trouwens wel een timestamp bij :X

voorbeeld:

Index, dateReg, Login, CharName
198, 12/16/2007 8:00:09 PM, 0, Piet
199,12/16/2007 8:01:39 PM,1, Piet
200,12/16/2007 8:05:45 PM, 0,Piet
201,12/16/2007 8:10:15 PM, 0, Harry
202,12/16/2007 8:12:20 PM,1, Harry

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dan wil je dus groeperen en een rij met max. of min. waarde hebben, dus google term: mysql groupwise maximum.

{signature}


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 20:05
Ik zou aan de log-tabel een trigger hangen die na elke update een veld 'loggedin' in de usertabel bijwerkt.

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • Shockers
  • Registratie: April 2002
  • Laatst online: 14:43
Ik kan nix toevoegen of wijzigen aan database is namelijk bestaande applicatie.
Alleen uitlezen is mogelijk.

@Voutloos
Gebruik geen mysql maar mssql zou volgens mij niets uit moeten uitmaken?

Acties:
  • 0 Henk 'm!

  • JortK
  • Registratie: Mei 2007
  • Laatst online: 26-09-2022
Je moet met MSSQL geen LIMIT gebruiken, maar TOP
Limiting Result Sets Using TOP and PERCENT
The TOP clause limits the number of rows returned in the result set.

TOP n [PERCENT]

n specifies how many rows are returned. If PERCENT is not specified, n is the number of rows to return. If PERCENT is specified, n is the percentage of the result set rows to return:

TOP 120 /*Return the top 120 rows of the result set. */
TOP 15 PERCENT /* Return the top 15% of the result set. */.

If a SELECT statement that includes TOP also has an ORDER BY clause, the rows to be returned are selected from the ordered result set. The entire result set is built in the specified order and the top n rows in the ordered result set are returned.

Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
En je hoeft niet beslist naar dat groupwise maximum te kijken, het kan ook gewoon met een group by.

Of iemand wel of niet ingelogd is kun je zien door het aantal inlog min aantal uitlog te doen.

SUM(CASE WHEN login = 0 THEN 1 END) AS AantalUitlog

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Shockers schreef op zondag 16 december 2007 @ 18:05:
Zit nu een dag te klote om in php een correct sql statement op te zetten. (php5 & mssql2000)

Het gaat om het volgende:

Ik wil alle gebruikers weergeven die op dat moment online zijn.

Dit wordt bijgehouden in een log tabel.
Waarom gebruik je een logtabel voor iets anders dan loggen? :?

Of een user online is is in een stateless omgeving als HTTP sowieso niet te bepalen, want je noemt nu mensen ook online die 2 jaar geleden toevallig een keer zijn ingelogd en nooit op uitloggen hebben gedrukt maar inmiddels al wel 4 computers versleten hebben en je URL noch je cookie meer hebben. Wat je dus wil is naast je bestaande AuditLog die login/logout acties bijhoudt in je User table (of beter nog Session) de LastActivity bijhouden. Vervolgens kun je in MSSQL simpel met datediff functies checken wie de afgelopen X minuten nog iets hebben gedaan op je site.
Shockers schreef op maandag 17 december 2007 @ 11:00:
Ik kan nix toevoegen of wijzigen aan database is namelijk bestaande applicatie.
Altijd fijn hoe bedrijven blijkbaar weer mensen zonder het minste verstand van zaken voor dit soort dingen weten te strikken.
@Voutloos
Gebruik geen mysql maar mssql zou volgens mij niets uit moeten uitmaken?
Thanks for making my point. Afgezien van de basisimplementatie van algemene SQL-92 instructies is er een wereld van verschil tussen MySQL's syntax en TransactSQL van MS SQL Server.

[ Voor 23% gewijzigd door curry684 op 18-12-2007 03:13 ]

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Shockers
  • Registratie: April 2002
  • Laatst online: 14:43
@all: Bedankt voor de hulp, het is me gelukt :)

In mssql wordt alles weer net even anders benoemt :(

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

En heb je nu de brakke implementatie werkend gekregen of ook je model op niveau gebracht?

Professionele website nodig?

Pagina: 1