SkarreMedlem sedan apr. 20012 447 inlägg
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
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
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
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
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
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
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
*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
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
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
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
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
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
Nej, inom samma connection.
------------------
essentitia preter non sans multiplicandum
HermanMedlem sedan maj 2001427 inlägg
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
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