webForumDet fria alternativet

Den skriver inte ut som jag vill

Databaser & SQLur Databashanterare & SQL

9 svar · 287 visningar · startad av ampy

ampyMedlem sedan feb. 20011 498 inlägg
#1

Har denna sql-sats:

	SQL = "SELECT * " & _
	" From forum_topics ft inner join forum_posts fp on ft.id_trad = fp.id_trad" & _
	" left outer join members m on m.id = ft.user_id" & _
	" WHERE ft.rum = '"&rummet1&"' order by ft.senasteinlagg desc, fp.id desc"

Den gör inte riktigt som jag vill. När jag skriver ut alla poster med hjälp av denna sql-sats så skriver den ut alla poster som finns i tabellen forum_posts. Men jag vill att den endast jag skriva ut alla poster som finns i forum_topics.

Fattar inte vad jag har gjort fel i sql-satsen.

Tabellerna ser ut som följande:

forum_topics
id_trad
subject
user_id
datum
rum
locked
senasteinlagg
ampymail
last
svar

forum_posts
id
id_trad
user_id
message
datum

members
id
username

Det jag vill göra är alltså först och främst hämta alla poster från tabellen forum_topics. Sen vill jag hämta det senaste inlägget från forum_posts där id_trad är lika med id_trad i tabellen forum_posts. Sen vil jag ju även veta namnet på user_id och den får jag alltså från tabellen members.

Vad har jag gjort för fel på min sql-sats?

LarsGMedlem sedan dec. 200012 464 inlägg
#2
SQL = "SELECT * " & _
	" From forum_topics ft inner join forum_posts fp on ft.id_trad = fp.id_trad" & _
	" left outer join members m on m.id = ft.user_id" & _
	" WHERE ft.rum = '"&rummet1&"' " &_
" and fp.id in (select max(id) from  forum_posts " & _
" where id_trad = fp.id_trad ) " & _
" order by ft.senasteinlagg desc, fp.id desc"
ampyMedlem sedan feb. 20011 498 inlägg
#3

På den får jag detta fel:

Microsoft OLE DB Provider for ODBC Drivers fel '80040e09' 
[TCX][MyODBC]You have an error in your SQL syntax near 'select max(id) from forum_posts where id_trad = fp.id_trad ) order by ft.sena' at line 1
LarsGMedlem sedan dec. 200012 464 inlägg
#4

Ah, Mysql och dess begränsningar. Får hitta på något annat.

Vad är senasteinlagg?

ampyMedlem sedan feb. 20011 498 inlägg
#5

Den innehåller det datum då det gjordes en post i den tråden. Man kan ju hämta det värdet i den andra tabellen (forum_posts) men det tar väl bara en massa tid?

LarsGMedlem sedan dec. 200012 464 inlägg
#6
QL = "SELECT * " & _
	" From forum_topics ft inner join forum_posts fp " & _
" on ft.id_trad = fp.id_trad and fp.datum = ft.senasteinlagg" & _
	" left outer join members m on m.id = ft.user_id" & _
	" WHERE ft.rum = '"&rummet1&"' order by ft.senasteinlagg desc, fp.id desc"
ampyMedlem sedan feb. 20011 498 inlägg
#7

Den satsen fungerar perfekt men jag glömde att lägga till en sak :l

Värdet fp.user_id innehåller ju det id på den användare som skrev inlägget sist i tråden. Även det usernamet vill jag hämta från tabellen members. Går det att fixa eller får jag skapa ett nytt recordset?

LarsGMedlem sedan dec. 200012 464 inlägg
#8
QL = "SELECT ft.*,fp.*,m1.*,m2.username as lastPoster " & _
	" From forum_topics ft inner join forum_posts fp " & _
" on ft.id_trad = fp.id_trad and fp.datum = ft.senasteinlagg" & _
" left outer join members m2 on m2.id = fp.user_ud " & _     
" left outer join members m1 on m1.id = ft.user_id" & _
" WHERE ft.rum = '"&rummet1&"' order by ft.senasteinlagg desc, fp.id desc"
ampyMedlem sedan feb. 20011 498 inlägg
#9

Du är verkligen grym på SQL! :birp

Fast kan du förklara vad det är för skillnad på inner join och outer join?

@ndersMedlem sedan juni 200032 969 inlägg
#10

En outer join ger resultat även om inte joinvillkoret uppfylls, då är alla kolumner från den injoinade tabellen null. I en inner join kommer inte dessa poster med överhuvudtaget.

Fast jag kanske inte fick svara? ;)

Mvh,

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