webForumDet fria alternativet

SQL problem...

8 svar · 207 visningar · startad av saw

sawMedlem sedan mars 20011 880 inlägg
#1

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.

Har ni något bra tips???

------------------
saw
__
saw@songer.com
www.mp3.com/saw_songer
_
_

sawMedlem sedan mars 20011 880 inlägg
#2

Jag kom på ett bra sätt, och löste det problemet.

------------------
saw
__
saw@songer.com
www.mp3.com/saw_songer
_
_

@ndersMedlem sedan juni 200032 969 inlägg
#3

Vad kom du på för bra sätt? :)

Mvh,

sawMedlem sedan mars 20011 880 inlägg
#4

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:

<A HREF="forhand.asp?ForumID=<%=RS("ForumID")%>&InlaggId=<%=RS("InlaggId")%>&ReplyId=<%=RS("ReplyId")%>" TITLE="Läs mera">

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

Något förslag om hur jag skall fixa det?

------------------
saw
__
saw@songer.com
www.mp3.com/saw_songer
_
_

LarsGMedlem sedan dec. 200012 464 inlägg
#5

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"

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

sawMedlem sedan mars 20011 880 inlägg
#6

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.

------------------
saw
__
saw@songer.com
www.mp3.com/saw_songer
_
_

iceM2Medlem sedan mars 2001243 inlägg
#7

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...

------------------
Ar i USA for tillfallet, kan ej anvanda svenska tecken, sorry...

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Inner join:

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.

ett exempel

A:

C1!C2
-----
11!AA
12!BB
13!CC

B:

C3!C4
-----
11!QQ
13!PP
14!RR

select * from a inner join b on c1 = c3

ger

C1!C2!C3!C4
-----------
11!AA!11!PP
13!CC!13!RR

select * from a left outer join b on c1 = c3

ger

C1!C2!C3!C4
-----------
11!AA!11!PP
12!BB!nu!nu
13!CC!13!RR

nu står för null

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

[Redigerat av LarsG den 10 jan 2002]

iceM2Medlem sedan mars 2001243 inlägg
#9

Tack så mycket LarsG!

------------------
Ar i USA for tillfallet, kan ej anvanda svenska tecken, sorry...

[Redigerat av iceM2 den 11 jan 2002]

255 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
124 ms — hämta forumlista (db)
124 ms — hämta statistik (db)
129 ms — hämta tråd, inlägg och bilagor (db)