webForumDet fria alternativet

Group

21 svar · 333 visningar · startad av Kristianstad

KristianstadMedlem sedan dec. 2002747 inlägg
#1

|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
#2
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
#3

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
#4

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
#5

Finns det inte något sätt att göra detta om man kör mySQL? :o

LarsGMedlem sedan dec. 200012 465 inlägg
#6

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
#7

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
#8

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
#9

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
#10

Jo, men här kan du inte skylla på Mysql.

Hur ser koden ut?

KristianstadMedlem sedan dec. 2002747 inlägg
#11

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
#12

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
#13

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
#14

skapar du nya connections för varje anrop? En temporär tabell försvinner när sessionen avslutas.

KristianstadMedlem sedan dec. 2002747 inlägg
#15

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
#16

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
#17

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
#18

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
#19

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
#20

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å?

Genererad på 380 ms · cache AV · v20260730165559-full.f96bc7eb