webForumDet fria alternativet

Får inte till den här queryn.

Databaser & SQL

15 svar · 290 visningar · startad av mikul

Medlem sedan aug. 20013 824 inlägg
Frågan#1

Hmm... Lyckas inte lösa det här själv.
Håller på med en sql-fråga för att hämta alla forum i databasen, men den hämtar alla forum lika många gånger som det finns trådar i forumet och det vill jag ju självklart inte.
Har försökt få nån distinct på det men inte lyckats få det rätt.
Kanske nån av er som vet hur det skall lösas.

SELECT f.senastesvarav, f.senastesvar, fl.ForumId,
fl.ForumNamn, fl.Information, fl.moderator, u.username
FROM ForumLista AS fl, UserInfo AS u, Forum AS f 
WHERE fl.moderator = u.username and 
f.forumid = fl.forumid and f.svarsid is null 
ORDER BY fl.Forumnamn ASC, f.senastesvar DESC;

Säg till om ni behöver se hur tabellerna ser ut.

/ Mikul

Medlem sedan mars 20034 471 inlägg
#2

Ja, jag tror det skulle underlätta om man visste hur tabellerna ser ut. Vill du ha ut alla kolumner ur tabellerna eller bara vissa? Jag är inte säker på att jag fattar vad du vill ha fram, för alla forum borde du väl hitta med:

SELECT ForumId, ForumNamn FROM ForumLista; ?

Medlem sedan aug. 20013 824 inlägg
#3

Jo men jag skall nämligen skriva ut lite andra saker också, typ vem som är moderator, vem som har gjort senaste svaret osv...

Forumlista:
forumid, forumnamn, information, moderator

Forum:
Id, forumid(vilket forum tråden/svaret tillhör), rubrik, text, userid(vem som skapat tråden/svaret), datum, svarsid(vilken tråd ett svar tillhör), SenasteSvar(datumet då senaste svaret skapades), SenasteSvarAv(användar idet för den som senast svarade)

UserInfo:
Userid, Username, password, mail, info, status(medlem, moderator osv)

SÅ nu kanske det blir lite lättare ;)

Medlem sedan mars 20034 471 inlägg
#4

Re: Får inte till den här queryn.

Förstår fortfarande inte: Varför vill du skriva ut moderatorinfon dubbelt?

SELECT .... fl.moderator, u.username
FROM ForumLista AS fl, UserInfo AS u, Forum AS f 
WHERE fl.moderator = u.username and ...

Alltså fl.moderator = u.username så samma sak skrivs ut dubbelt. Varför? :q

Bättre med:

SELECT f.senastesvarav, f.senastesvar, fl.ForumId,
fl.ForumNamn, fl.Information, fl.moderator
FROM ForumLista AS fl, Forum AS f 
WHERE f.forumid = fl.forumid and f.svarsid is null 
ORDER BY fl.Forumnamn ASC, f.senastesvar DESC;

Ger det fortfarande fel svar?

Medlem sedan dec. 200012 464 inlägg
#5

Du vill alltså ha senaste svar per forum och namnet på den som postade det inlägget?

Och du använder Mysql?

Vill bara veta förutsättningarna.

Medlem sedan aug. 20013 824 inlägg
#6

Vet inte varör jag har skrivit så om jag skall vara ärlig, är helt körd i hövvet för tillfället...

Det ger dock fortfarande samma svar. :(

Medlem sedan aug. 20013 824 inlägg
#7

LarsG: Precis, Jag använder dock Access för tillfället ;)

Medlem sedan dec. 200012 464 inlägg
#8

Det är en fördel för den typen av frågor klarar inte Mysql av men det går utmärkt i Access.

SELECT (select senastesvarav from forum f
  where forumid = fl.forumid
      and senastesvar = (select max(senastesvar) 
     from forum where forumid = f.forumid ),
   (select max(senastesvar) from forum
     where forumid = fl.forumid),
   ForumId,
   ForumNamn, 
   Information, 
   moderator
 FROM ForumLista AS fl  
ORDER BY Forumnamn ASC
Medlem sedan aug. 20013 824 inlägg
#9

Ok..Fick dock det här felet nu.

Feltyp:
Microsoft JET Database Engine (0x80040E14)
Missing ), ], or Item in query expression '(select senastesvarav from forum f where forumid = fl.forumid and senastesvar = (select max(senastesvar) from forum where forumid = f.forumid ), (select max(senastesvar) from forum where forumid = fl.forumid), ForumId, ForumNamn, Information, Moderator FR'.
Medlem sedan dec. 200012 464 inlägg
#10

Jaha, det saknas en parentes. Det är väl inte så svårt att se var?

SELECT (select senastesvarav from forum f
  where forumid = fl.forumid
      and senastesvar = (select max(senastesvar) 
     from forum where forumid = f.forumid )),
Medlem sedan aug. 20013 824 inlägg
#11

Nä iof, men jag är så otroligt trött i skallen nu ;)

Medlem sedan aug. 20013 824 inlägg
#12

Tack så mycket hittils ;)
Men jag vill också ha ut SensasteSvarav i recordsetet, hur skall det se ut då?

Medlem sedan dec. 200012 464 inlägg
#13

Du kan använda rs(0) etc eller så namnger du värdet i frågan

SELECT (select senastesvarav from forum f
  where forumid = fl.forumid
      and senastesvar = (select max(senastesvar) 
     from forum where forumid = f.forumid )) as xxx,
Medlem sedan aug. 20013 824 inlägg
#14

Ok, men nu tror jag allt att jag har rört tilld et för mig...
Jag är aldeless för seg i skallen för att kunna lösa det här själv nu. Hoppas att du har lust att hjälpa till lite..

Finns det nåt enklare sätt att lösa det här på:

Query ="SELECT (select senastesvarav from forum f where forumid = fl.forumid and senastesvar = (select max(senastesvar) "&_
	"from forum where forumid = f.forumid )), (select max(senastesvar) from forum where forumid = fl.forumid), "&_ 
	"ForumId, ForumNamn, Information, Moderator FROM ForumLista AS fl ORDER BY Forumnamn ASC"	
Set rs = Connect.Execute(Trim(Query))
								
								
If not rs.eof Then
	Response.write 	"<div align=left>"&_
						"<table border=0 cellpadding=5 cellspacing=0 style=border-collapse: collapse bordercolor=#111111 width=100% id=AutoNumber1>"&_
							"<tr>"&_
								"<td valign=top width=""40%"" hight=10>ForumNamn:</td>"&_
								"<td valign=top width=""20%"" hight=10>Antal inlägg:</td>"&_
								"<td valign=top width=""13%"" hight=10>Moderator:</td>"&_
								"<td valign=top width=""22%"" hight=10>Senaste svar:</td>"&_
							"</tr>"
									
									
	While not rs.Eof
							
		Senastid = rs(0)
		forumid = rs("forumid")
										
		Set rs2 = Connect.Execute("SELECT u.username, u.userid, f.forumid, fl.forumid "&_
 			"from Userinfo as u, forumlista as fl, forum as f "&_
			"where u.userid = "& senastid &" and f.forumid = fl.forumid and f.svarsid is null;")
									
		arr = rs2.GetRows()
		strSenasteSvarAv = arr(0,0)
		rs2.close : set rs2 = nothing
										
										
		set Count = Connect.execute("select count(*) from forum where forumid = "& ForumId &";")
		iCount = Count(0)
		Count.close : Set Count = nothing
											
		Response.write 	"<tr>"
		Response.write 		"<td valign=top width=""40%"" hight=10><a href=?cat=forum&forumId="& forumid &"><b>"& rs("ForumNamn") &"</b></a><br>"& rs("information") &"</td>"
		Response.write 		"<td valign=top width=""20%"" hight=10>"& iCount &"</td>"
		Response.write 		"<td valign=top width=""13%"" hight=10>"& rs("moderator") &"</td>"
		Response.write 		"<td valign=top width=""22%"" hight=10>"& strSenasteSvarAv &":<br>"& rs("SenasteSvar") &"</td>"
		Response.write 	"</tr>"
		rs.movenext
	Wend
							
	Response.write 	"</tr></table>"
	rs.close : set rs = Nothing
End if

får nämligen:

Feltyp:
ADODB.Recordset (0x800A0BCD)
Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
/mikul/forum.asp, line 146

på den här queryn:

Set rs2 = Connect.Execute("SELECT u.username, u.userid, f.forumid, fl.forumid "&_
	"from Userinfo as u, forumlista as fl, forum as f "&_
	"where u.userid = "& senastid &" and f.forumid = fl.forumid and f.svarsid is null;")
Medlem sedan aug. 20013 824 inlägg
#15

Tack så mycket för hjälpen LarsG!
Lyckades lösa det sista själv nu.

Senastid = rs(0)
senastesvar = rs(1)
forumid = rs("forumid")

set Count = Connect.execute("select count(*), (select username from userinfo where userid = "& senastid &") as xxx from forum where forumid = "& ForumId &";")
iCount = Count(0)
senastesvarav = count("xxx")
Count.close : Set Count = nothing

Tack åter igen! :D

Medlem sedan sep. 20026 425 inlägg
#16

mikul skrev:

arr = rs2.GetRows()
strSenasteSvarAv = arr(0,0)
rs2.close : set rs2 = nothing

Äntligen nån mer än jag som använder GetRows() och visar det! *Tummen upp* för mikul!
Hoppas allt löste sig bra.

259 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)