webForumDet fria alternativet

Forum - SQL-problem

15 svar · 201 visningar · startad av Skarre

SkarreMedlem sedan apr. 20012 447 inlägg
#1

Efter att ha hört mig för här på webForum gjorde jag mitt forum med två tabeller; en för huvudämnen (tblTopics) och ett för svar (tblReplies) och det fungerar fint. Men problem uppstår när jag på en annan sida vill visa de 5 senaste inläggen och eventuellt ett kort utdrag ur dessa. Jag tror jag behöver hjälp med sql-satsen.

Så här ser tabellerna ut.

tblTopics:
* TopicID
* Subject
* Body
* UserID
* Date
* LastPost

tblReplies:
* ReplyID
* TopicID
* Body
* UserID
* Date

Jag började skriva en sql-sats, men insåg ganska snart att den inte skulle fungera.

"SELECT TOP 5 * FROM tblTopics, tblReplies ORDER BY..." <--?

Jag sökte lite på sql tutorial-länken ovan, men jag vet inte riktigt vad jag ska leta efter.

------------------
// Skarre

EchOMedlem sedan aug. 2001103 inlägg
#2

Testa det här:

<%
sql="select top 5* from tblTopics order by Date DESC"
Set rs = conn.Execute(SQL)
while not rs.eof
SQL2="select * FROM tblReplies where TopicId = " & RS("TopicID")
set rs2 = conn.execute(SQL2)	
%>
          <%= RS("Subject") %> 
          <%= RS2("Body") %>">
          <%= RS2("Date") %>
              
<%
rs.movenext
loop
%>

Kanske inte världens smidigaste lösning men d bör fonka...

@EchO

VideMedlem sedan dec. 19996 094 inlägg
#3

Om jag fattat dina fält rätt så:

Select Top 5 * from tblTopics Inner Join tblReplies On tblTopics.TopicID = tblReplies.TopicID

------------------
Doesn't 'expecting the unexpected' make the unexpected expected?
webeye.nu

EchOMedlem sedan aug. 2001103 inlägg
#4

Vide...

Hämtar den bara top 5 från tblReplies oxå eller hämtar den all data där tblTopics.TopicID = tblReplies.TopicID

@EchO

SkarreMedlem sedan apr. 20012 447 inlägg
#5

Jag har testat Vides, och det sket sig med inlägg som inte har några svar. Vad gäller ditt förslag, EchO, tror jag inte heller det fungerar eftersom du endast hämtar bodyn från tblReplies. Vad händer om det senaste inlägget är ett huvudämne och således ligger i tblTopics? Jag vet inte hur jag ska lösa detta, men jag är rädd för att jag ska behöva göra stora förändringar i databasstrukturen.

Jag skulle behöva lägga ihop alla "Subject", "Body", "Date" och "TopicID" från båda tabellerna till en ny (tillfällig) tabell och sortera efter "Date".

------------------
// Skarre

VideMedlem sedan dec. 19996 094 inlägg
#6

Jag skulle för det första inte använda den databasmodellen du använder, utan lägga alla inlägg i samma tabell, oavsätt om det är svar eller inte. Som du ser i dina tabeller så är det inte mycket som skiljer dom åt, och det skulle bli betydligt lättare att programmera mot om dom låg i samma tabell.

Annars kommer LarsG med en briljant lösning... ;)

------------------
Doesn't 'expecting the unexpected' make the unexpected expected?
webeye.nu

LarsGMedlem sedan dec. 200012 465 inlägg
#7

Jag håller med Vide, dvs att du bör ändra på datamodellen.

Med nuvarande datamodell går det att lösa med hjälp av en fråga(beroende på vilken dbms du har), men den blir ganska ineffektiv.

------------------
essentitia preter non sans multiplicandum

SkarreMedlem sedan apr. 20012 447 inlägg
#8

*suck* Alla inlägg låg i en tabell förut, jag vet inte varför jag ändrade på det. :) Tack för hjälpen i alla fall.

------------------
// Skarre

SkarreMedlem sedan apr. 20012 447 inlägg
#9

Då återkommer genast det problemet som diskuterades i just det inlägg jag talade om: http://cgi.webforum.nu/wf/Forum11/HTML/007135.html

LarsG, du nämnde någonting om att min metod inte var helt säker. Vet du då hur jag skulle kunna göra den säker?

------------------
// Skarre

LarsGMedlem sedan dec. 200012 465 inlägg
#10

Risken med att göra

select top 1 from t order by id desc

för att få reda på id för senast inlagda post är att någon annan kan hinna att göra insert mellan den tidpunkt då du gör insert och då du gör select. Du kan alltså få tag på ett id som hör till en annan post.

Det finns inbyggda funktioner för att hantera detta och i Access 2000 så kan
man göra

select @@identity

och sedan hämta det som ett vanligt resultat.

------------------
essentitia preter non sans multiplicandum

SkarreMedlem sedan apr. 20012 447 inlägg
#11

Men den sql-satsen använde jag för att räkna ut vilket som var det högsta "TopicID":t eftersom jag inte kan ha en räknare på den kolumnen. Men ditt resonemang kanske stämmer även här.

Nu när jag bara använder en tabell (igen) har jag en kolumn kallad "TopicID" för att jag ska veta vilka inlägg som tillhör samma tråd. Flera poster har alltså samma "TopicID", och det är därför jag inte kan använda en räknare.

Men alla trådar (huvudämnen och dess svar) måste ju ha ett unikt "TopicID", och eftersom jag av ovanstående anledning inte kan använda en räknare måste jag hämta det högsta "TopicID":t och lägga på 1.

Menar du då att två om två personer startar ett nytt ämne samtidigt, så kan de få samma TopicID?

------------------
// Skarre

[Redigerat av Skarre den 13 nov 2001]

LarsGMedlem sedan dec. 200012 465 inlägg
#12

Om du använder två tabeller

topics

topicid int -- räknare
subject varchar(100)
dateStarted date

posts

topicid int -- fk topics
postid int -- räknare
postedBy int -- fk users
reply boolean -- falskt om första inlägg
body pm

så går det bra att använda räknare.

------------------
essentitia preter non sans multiplicandum

HermanMedlem sedan maj 2001427 inlägg
#13

Har stundom undrat om verkligen select @@identity är bombsäkert i webbsammanhang. select @@identity hämtar ju senaste id:t för en specifik användare. Men i fallet webbserver är det alltid samma användare, nämligen webbservern. Torde kunna bli fel om man har otur. Eller hur?

------------------
En eller annan godbit från pannan

LarsGMedlem sedan dec. 200012 465 inlägg
#14

Nej, inom samma connection.

------------------
essentitia preter non sans multiplicandum

HermanMedlem sedan maj 2001427 inlägg
#15

Jo, men med tanke på att connections "poolas" och ASP/ADO oftast är "stateless" torde det innebär att man är inte garanterad samma connection för alla kommandon via ADO till databasen. hehe jag måste låta paranoid :)

------------------
En eller annan godbit från pannan

LarsGMedlem sedan dec. 200012 465 inlägg
#16

Om du gör

open
insert
select @@identity
close

så kan det inte gå fel

Om du gör

open
insert
close

open
select @@identity
close

så blir det fel. Javisst,men vem gör så?

------------------
essentitia preter non sans multiplicandum

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