Innan jag berättar om mitt problem, vill jag visa hur min databas ser ut.
Tabellen Forum
ForumID Primärnyckel
InlaggId Relation till tabbelen Person PerID
ReplyID är det unika nummeret som binder ihop inläggen och svar.
Amne
Hits hur många gånger forumet har lästs
Icon
Svar hur många som har svarat på forumet
org Om det finns svar(måste nog ta bort denna)
Tabellen Inlagg
InID Primärnyckel
InlaggID
Datum
PersonID
ReplyID
Inlagg
Tabellen Person
PersonID
Namn
Epost
Skrivit hur många inlägg personen gjort
InläggID
Relationerna är emellan
Forum.ForumID till Inlagg.InlaggID
Och
Inlagg.PersonID till Person.PersonId
Vad jag vill åstakomma är ungefär som på detta forum. På förstasidan skall man bara se den som har startat forumet och därefter klicka sig vidare för att kunna läsa alla inlägg.
Jag använder denna SQL
RS.OPEN "SELECT Forum.ForumId, Forum.InlaggID, Forum.ReplyID, Forum.Amne, Inlagg.Datum, Forum.Hits, Forum.Icon, Forum.Svar, Forum.Org, Person.PersonId, Person.Namn, Person.Epost, Person.Skrivit, Inlagg.InlaggId, Inlagg.Inlagg "&_
" FROM Person INNER JOIN (Forum RIGHT JOIN Inlagg ON Forum.ForumId = Inlagg.InlaggId) ON Person.PersonId = Inlagg.PersonId WHERE Org = TRUE ORDER BY Datum DESC;", connection, adopenkeyset, adlockoptimistic
Men jag kan inte få till det bra.
T ex:
Bosse har börjat att skriva
Johan svara
Karl svara osv
SQL:en ovan visar alla tre, fast den skulle bara visa Bosses första inlägg.
Jo jag satte in en kryssbox i tabellen inlagg, och ser till att enbart det första inlägget så fylls den. Smart??
Då är det ju enkelt att ta fram vad jag ville ha.
Men mitt nästa problem är inte så enkelt.
När jag klicka på denna länk:
så kommer jag till sidan som skall visa medelanden.
Men jag får inte fram dom bra.
Endera så ser jag enbart första medelandet, eller så uppreppas medellanden dubbelt.
Så här ser SQL:en ut:
If Request.Querystring("ReplyID")>=1 Then
SQL="SELECT * FROM Forum, Inlagg,Person WHERE Forum.ReplyID=" & Request("ReplyID") &"AND Inlagg.ReplyID=" & Request("ReplyID") &" ORDER BY Inlagg.Datum"
Else
SQL="SELECT Forum.ForumId, Forum.InlaggID, Forum.ReplyID, Forum.Amne, Inlagg.Datum, Forum.Hits, Forum.Icon, Forum.Svar, Person.PersonId, Person.Namn, Person.Epost, Person.Skrivit, Inlagg.InlaggId, Inlagg.Inlagg "&_
" FROM (Forum RIGHT JOIN Inlagg ON Forum.ForumId = Inlagg.InlaggId) INNER JOIN Person ON Inlagg.PersonId = Person.PersonId "&_
" WHERE Forum.ForumID=" & Request("ForumID") &" AND Forum.ReplyID=" & Request("ReplyID") &" ORDER BY Forum.InlaggID,Forum.ForumId"
End If
I din första select så har du inget joinvillkor mellan inlagg och person-tabellen
SQL="SELECT * FROM Forum, Inlagg,Person WHERE Forum.ReplyID=" & Request("ReplyID") &"AND Inlagg.ReplyID= forum.replyid and inlagg.personid = person.personid ORDER BY Inlagg.Datum"
Borde det inte vara left join i din andra select?
SQL="SELECT Forum.ForumId, Forum.InlaggID, Forum.ReplyID, Forum.Amne, Inlagg.Datum, Forum.Hits, Forum.Icon, Forum.Svar, Person.PersonId, Person.Namn, Person.Epost, Person.Skrivit, Inlagg.InlaggId, Inlagg.Inlagg "&_
" FROM (Forum LEFT JOIN Inlagg ON Forum.ForumId = Inlagg.InlaggId) LEFT JOIN Person ON Inlagg.PersonId = Person.PersonId "&_
" WHERE Forum.ForumID=" & Request("ForumID") &" AND Forum.ReplyID=" & Request("ReplyID") &" ORDER BY Forum.InlaggID,Forum.ForumId"
Tack LarsG du löste ett stort problem.
Det visade sig att
SQL="SELECT * FROM Forum, Inlagg,Person WHERE Forum.ReplyID=" & Request("ReplyID") &"AND Inlagg.ReplyID= forum.replyid and inlagg.personid = person.personid ORDER BY Inlagg.Datum"
var allt som behövdes, inte två olika.
Som jag ser det nu (jag är no lite tuff nu) så har jag en kanongrund att stå på, så nu är det bara ögongodis kvar.
Tack igen.
När det ändå tas upp så kanske någon skulle vilja förklara när det är lämpligt att använda innerjoin, leftjoin... Har aldrig fattat det, tacksam för en bra förklaring... Fixade en sql bok men där står det inget om det...
select * from a inner join b on [i]search_condition[/i]
returnerar alla poster där search_condition är sant.
Outer left join
select * from a left outer join b on [i]search_condition[/i]
Fungerar som en inner join frånsett de att poster från den vänstra tabellen returneras även om det inte finns någon post i den högra tabellen som uppfyller villkoret.
Då inner och outer join ger olika resultat så kan man inte säga att endera är mer lämplig.