webForumDet fria alternativet

Group

Databaser & SQLur Databashanterare & SQL

21 svar · 333 visningar · startad av Kristianstad

Medlem sedan dec. 2002841 inlägg
Frågan#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.

Medlem sedan dec. 200012 464 inlägg
#2
SELECT sID, Tid, Plats 
FROM Tabell t
where tid in (
select max(tid)
  from tabell
 where sid = t.sid)
Medlem sedan dec. 2002841 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?

Medlem sedan dec. 200012 464 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.

Medlem sedan dec. 2002841 inlägg
#5

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

Medlem sedan dec. 200012 464 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

Medlem sedan dec. 2002841 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! :)

Medlem sedan dec. 200012 464 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.

Medlem sedan dec. 2002841 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?

Medlem sedan dec. 200012 464 inlägg
#10

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

Hur ser koden ut?

Medlem sedan dec. 2002841 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'

Medlem sedan dec. 200012 464 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")
Medlem sedan dec. 2002841 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.

Medlem sedan dec. 200012 464 inlägg
#14

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

Medlem sedan dec. 2002841 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.

Medlem sedan dec. 2002841 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

Medlem sedan dec. 200012 464 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).

Medlem sedan dec. 2002841 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.

Medlem sedan dec. 200012 464 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")
Medlem sedan dec. 2002841 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å?

132 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
125 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)