webForumDet fria alternativet

Hur skriver jag denna SQL-fråga?

5 svar · 369 visningar · startad av Andy

AndyMedlem sedan sep. 2001138 inlägg
#1

Har ett forum som består av tre databastabeller:

tableForums
id | räknare
title | namnet på forumet

tableTopics
id | räknare
topic | tråd-rubrik
text | själva inlägget
date | datumet då tråden startades
poster | (integer) medlem som startade tråden
BelongsInForum | (integer)

tablePosts
id | räknare
text | själva inlägget
date | datumet då inlägget postades
poster | (integer) medlem som skrev inlägget
BelongsToTopic | (integer)

Nu vill jag på en sida rada upp alla olika forum, samt den tidpunkt då det senaste inlägget/tråden gjordes. Denna tidpunkt är ju ett datum som hämtas antingen från tableTopics, eller från tablePosts.

Hur skriver jag den SQL-satsen?

På en annan sida vill jag lista alla topics i ett forum. Även här vill jag visa datum för senaste inlägget i varje tråd. Detta datum hämtas antingen från tableTopics - om inget svar gjorts i tråden - eller från tablePosts - och i så fall datumet då det senaste inlägget i tråden gjordes.

Hur skriver jag den SQL-satsen?

LarsGMedlem sedan dec. 200012 464 inlägg
#2
select f.title, max(coalesce(tp.date,tt.date))
from forum f left join tableTopics tt
 on f.id = tt.belongsInForum  left join tablePosts tp 
 on tt.id = tp.belongsToTopic
group by f.title
select topic, max(coalesce(tp.date,tt.date))
  from tableTopics tt  left join tablePosts tp 
 on tt.id = tp.belongsToTopic
 where belongsInForum in (
  select id from forum 
   where title = 'Alkemi')
group by topic
AndyMedlem sedan sep. 2001138 inlägg
#3

Toppen! tackar!

För att göra det lite svårare (?):

tableTopics och tableReviews har ju även en kolumn som heter Poster, som innehåller ID:t på personen som postat det senaste inlägget. Hur får jag med denna kolumn i mina recordset?

Har även en tabell som ser ut så här:

tableUsers
ID | Räknare
Name | Användarnamnet

Förutom ID för personen som postat, vill jag även ha med personens användarnamn.

LarsGMedlem sedan dec. 200012 464 inlägg
#4
select f.title, date,poster
from (
select  id,date,poster, BelongsInForum as forumId
  from tableTopics
union
select  BelongsToTopic, date,poster ,
(select belongsInForum from tableTopics
  where id = tp.BelongsToTopic ) 
from tablePosts tp) dt
inner join forum f on dt.id = f.id 
where date in (
select  max(coalesce(tp.date,tt.date))
from forum f2 left join tableTopics tt
 on f2.id = tt.belongsInForum  left join tablePosts tp 
 on tt.id = tp.belongsToTopic
where f2.id = f.id
group by f.title)

Det är nu man ser en brist i din design.

Jag skulle ha lagrat även första inlägget (inklusive vem och datum) för en topic i tablePosts-tabellen.

Fråga 2 lämnas som övning åt läsaren.

AndyMedlem sedan sep. 2001138 inlägg
#5

Tack så mycket. Skall testa det ASAP.

Inte alls förvånad att det finns designbrister... :)

Men om jag även skulle lagra själva tråden i tablePosts, vad ska jag då med tableTopics-tabellen till? Behövs den inte alls då?

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Den kan tillexempel innehålla id, titel, belongsInForum. Du kanske också vill lagra antalet inlägg, senaste datum etc så man slipper beräkna det varje gång. Det innebär ju att du får uppdatera den tabellen vid varje inlägg men det kan det vara värt eftersom det är mest läsningar i ett forum.

137 ms totalt · 3 externa anrop · v20260731065814-full.16f3d68c
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)