KristianstadMedlem sedan dec. 2002747 inlägg
|sID|Tid|Plats
|Abc|2003-03-16 10:03:02|sida1.asp
|Abc|2003-03-16 10:03:08|sida9.asp
|Abc|2003-03-16 10:03:20|default.asp
|Def|2003-03-16 10:03:02|sida1.asp
|Abc|2003-03-16 10:03:09|default.asp
En sql-fråga skall få det att skriva ut:
Abc - default.asp - 2003-03-16 10:03:20
Def - sida1.asp - 2003-03-16 10:03:02
Den skall alltså "gruppera" sID och sedan ta den Plats där Tid är senast.
Jag testade med
SELECT sID, Tid, Plats FROM Tabell group by sID ORDER BY Tid DESC
, men den tar inte det värde där Tid är senast.
LarsGMedlem sedan dec. 200012 465 inlägg
SELECT sID, Tid, Plats
FROM Tabell t
where tid in (
select max(tid)
from tabell
where sid = t.sid)
KristianstadMedlem sedan dec. 2002747 inlägg
Hej! :)
[TCX][MyODBC]Du har något fel i din syntax nära 'select max(tid) from Online where sid = t.sid)' på rad 1
Vad är det som är galet?
LarsGMedlem sedan dec. 200012 465 inlägg
Visst ja, du använder Mysql. Det går inte med en fråga så länge dom inte har stöd för subselect.
KristianstadMedlem sedan dec. 2002747 inlägg
Finns det inte något sätt att göra detta om man kör mySQL? :o
LarsGMedlem sedan dec. 200012 465 inlägg
det blir med temporära tabeller och flera frågor.
create temporary table t(sid char(4), tid datetime)
select max(tid),sid from tabell
group by sid
select tabell.* from tabell join t on on tabell.sid = t.sid and tabell.tid = t.tid
KristianstadMedlem sedan dec. 2002747 inlägg
Jag testade SELECT sID, sSida, max(Tid), ID FROM Online group by sID och det fungerar hittills. Eller finns det någon "bugg" i den sql-frågan?
Tack! :)
LarsGMedlem sedan dec. 200012 465 inlägg
Det finns det.
Det är ingen garanti att värdet för sSida hämtas från den post där max(tid) hittas. Vilket värde som helst inom gruppen kan returneras.
Hela denna konstruktion är väldigt försåtlig eftersom det är svårt att upptäcka att man gör fel. Det är bara Mysql som tillåter denna korkade semantik.
KristianstadMedlem sedan dec. 2002747 inlägg
mySQL är kanske inte så bra egentligen.
[TCX][MyODBC]Kolumn namn 'sid finns flera gånger
blev det nu. Felet ligger på den första sql-frågan där den temporära tabellen skapas.
Jag kör väl en vanlig execute på den?
LarsGMedlem sedan dec. 200012 465 inlägg
Jo, men här kan du inte skylla på Mysql.
Hur ser koden ut?
KristianstadMedlem sedan dec. 2002747 inlägg
Kom på det. Det verkar som om man inte kan ha samma namn på fälten.
create temporary table t(sidA char(4), tidB datetime)
select max(tid),sid from tabell
group by sid
Nu ser det ut så här: (obs! jag har funktioner som fixar execute)
andraDbRows("create temporary table t(sida char(4), tida datetime) select max(tid),sid from online group by sid")
minArray = getDbRows("select online.* from online join t on online.sid = t.sida and online.tid = t.tid")
Felet blir nu:
[TCX][MyODBC]Du har något fel i din syntax nära 'on on online.sid = t.sida and online.tid = t.tid'
LarsGMedlem sedan dec. 200012 465 inlägg
Ja visst, mysql kräver att du skriver vilken jointyp du använder.
minArray = getDbRows("select online.* from online inner join t on online.sid = t.sida and online.tid = t.tid")
KristianstadMedlem sedan dec. 2002747 inlägg
Det händer ingenting. Blir tomt. RecSet.EOF=True
Så här ser det ut nu:
andraDbRows("create temporary table t(sida char(4), tida datetime) select max(tid),sid from online group by sid")
minArray = getDbRows("select online.* from online inner join t on online.sid = t.sida and online.tid = t.tida")
Vad är det som är galet?
Jag har en liten fråga angående temporära tabeller också. Fungerar det när det är flera användare där samtidigt? Det verkar som om den inte fungerar med flera samtidigt. Den säger att T inte finns. Jag kör även DROP TABLE T, men vem vet om någon användare kommer in innan den koden körs.
LarsGMedlem sedan dec. 200012 465 inlägg
skapar du nya connections för varje anrop? En temporär tabell försvinner när sessionen avslutas.
KristianstadMedlem sedan dec. 2002747 inlägg
Jag får det inte att visa något. Varför? Även om jag kör det i samma connection. Om jag kör rs.eof så är den TRUE.
Vad är det som är galet?
Märk väl att rs.eof är FALSE om man bara skriver select * from t.
KristianstadMedlem sedan dec. 2002747 inlägg
Kom på att det underlättar kanske felsökandet för dig om jag ger dig den kod som jag har just nu:
<%
Set Conn = Server.CreateObject("ADODB.Connection")
' Koppling
Set gbo = Conn.Execute("create temporary table t(sida char(4), tida datetime) select max(tid),sid from online group by sid")
Set gbo = Conn.Execute("select online.* from online inner join t on online.sid = t.sida and online.tid = t.tida")
If gbo.EOF = True Then
%>Tomt<%
End If
Set gbo = Nothing
Conn.Close
Set Conn=Nothing
Resultatet då man kör denna kod är:
Tomt
LarsGMedlem sedan dec. 200012 465 inlägg
create table med select i Mysql är lite udda.
Som din kod är skriven så kommer t att innehålla fyra kolumner (sida,tida,,sid). Om namnen mellan kolumnlistan och selectsatsen inte stämmer så tolkas det som nya kolumner.
Set gbo = Conn.Execute("create temporary table t(sid char(4), tid datetime) select sid,max(tid) as tid from online group by sid")
Det var också fel ordning mellan kolumnerna (mitt fell).
KristianstadMedlem sedan dec. 2002747 inlägg
Hej och tack för svar!
Nu kommer
[TCX][MyODBC]Kolumn namn 'sid finns flera gånger
vid körande av denna kod.
LarsGMedlem sedan dec. 200012 465 inlägg
Hmm, det här inget som jag har någon praktisk erfarenhet av så jag försöker bara tolka manualen
Du borde kunna skriva så här
Set gbo = Conn.Execute("create temporary table t select sid,max(tid) as tid from online group by sid")
KristianstadMedlem sedan dec. 2002747 inlägg
Tack! Äntligen fungerade det! :) Tack!
Förresten:
Första gången man kör koden fungerar den utmärkt men om man uppdaterar sidan (F5) kommer det upp att Tabellen 't' finns redan. Jag har det i samma connection. Vad kan det bero på?