webForumDet fria alternativet

Hämta data från flera olika tabeller med joins

Databaser & SQL

20 svar · 554 visningar · startad av mattiasnordin

Medlem sedan maj 20012 080 inlägg
Frågan#1

tblTopic
------------
Topic_ID | Forum_ID | Subject | No_of_views | Last_entry_date

tblThread
------------
Thread_ID | Topic_ID | Authur_ID

tblForum
------------
Forum_ID | Forum_name

tblAuthor
------------
Author_ID | Real_Name | Username

Hej hopp... Försöker få ut lite information ifrån ett forum. Använder koden nedan för att visa de tre senaste från rubriktabellen. Gör sedan en join för att ta reda på forumnamnet.

<% sql = "SELECT TOP 3 * FROM tblTopic " 				'HÄMTAR DE TRE SENASTE POSTERNA FRÅN tblTopic
sql = sql &" LEFT JOIN tblForum "						'HÄMTAR FORUMNAMNET FRÅN tblForum
sql = sql &" ON tblTopic.Forum_ID = tblForum.Forum_ID "	
sql = sql &" ORDER BY tblTopic.Last_entry_date DESC"	'SORTERAR EFTER SENASTE SKRIVNA POST
'response.write sql

Allt ovan fungerar som det ska men jag vill nu även ha ut namnet på den som skrev det senaste svaret. Hur gör man det?

Namnet sparas i tblAuthor. Och i Author_ID är sparat i tblThread. I övrigt är jag inte intresserad av någon information från tblThread.

Lars, det här är väl inte ens en utmaning för dig ??? he he... :stud

Medlem sedan dec. 200012 464 inlägg
#2
SELECT TOP 3 subject,forum_name,
(select Username
   from tbl_author a
  inner join tbl_threads th on a.author_id = th.author_id
 where th.topic_id  = t.topic_id) as lastAuthor
 FROM tblTopic t
 LEFT JOIN tblForum f ON t.Forum_ID = f.Forum_ID 
 ORDER BY t.Last_entry_date DESC
Medlem sedan maj 20012 080 inlägg
#3

Jag tror att jag har läst frågan 7 ggr nu. Svår att förstå för en simple minded. ;)

Medlem sedan maj 20012 080 inlägg
#4

Visste inte att man kunde göra dubbla selects i samma query. Smidigt värre :-)

Medlem sedan dec. 200012 464 inlägg
#5

Och det betyder att det inte fungerar eller?

Medlem sedan maj 20012 080 inlägg
#6

Jag hann inte testa tidigare.

sql = "SELECT TOP 3 subject, forum_name, "
sql = sql & "(select Username "
sql = sql & " from tblAuthor a "
sql = sql & " inner join tblThread th on a.Author_ID = th.Author_ID "
sql = sql & " where th.Topic_ID  = t.Topic_ID) as lastAuthor "
sql = sql & "  FROM tblTopic t "
sql = sql & "  LEFT JOIN tblForum f ON t.Forum_ID = f.Forum_ID "
sql = sql & "  ORDER BY t.Last_entry_date DESC "

Ger

webservern skrev:

ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.

/web2005/_design/latest_blog/_inc_show_newest_threads.asp, line 23

Jag har försökt att kontrollera att alla namn stämmer med databasen. :/

Medlem sedan juni 200032 967 inlägg
#7

Det där felet kommer från koden som försöker använda ett fält som inte finns i recordsetet. Kolla att du hämtar det du försöker använda.

Medlem sedan maj 20012 080 inlägg
#8

Man ska aldrig tvivla på LarsG:s eminenta hjärna. Detta meddelande borde vara en sticker på detta forum :)

Koden fungerar om man småändrar lite. Men jag får fortfarande fel på markerad rad...

sql = "SELECT TOP 3 Subject, Forum_name, Last_entry_date, No_of_views "
sql = sql & "(select Username "
sql = sql & " from tblAuthor a "
sql = sql & " inner join tblThread th on a.Author_ID = th.Author_ID "
sql = sql & " where th.Topic_ID  = t.Topic_ID) as lastAuthor "
sql = sql & "  FROM tblTopic t "
sql = sql & "  LEFT JOIN tblForum f ON t.Forum_ID = f.Forum_ID "
sql = sql & "  ORDER BY t.Last_entry_date DESC "
'sql = "SELECT TOP 3 * FROM tblTopic "
'sql = sql &" LEFT JOIN tblForum "
'sql = sql &" ON tblTopic.Forum_ID = tblForum.Forum_ID "
'sql = sql &" ORDER BY tblTopic.Last_entry_date DESC"
response.write sql
set rs = objConn.execute(sql)
while not rs.eof 
varSubject = rs("Subject")
varLastEntryDate = rs("Last_entry_date")
[b]varViewsNum = rs("No_of_views")[/b]
varId = rs("Topic_ID")
varForumName = rs("Forum_name")
Medlem sedan dec. 200012 464 inlägg
#9

använder du lastAuthor när du hämtar namnet på den som skrivit sista inlägget?

Du får visa lite ASP-kod annars.

Medlem sedan maj 20012 080 inlägg
#10

Har tidigare visat:

	<div class=text>
	<b><%=varSubject%></b><br> 
	<font face=tahoma size=1 color=gray>Från forumet "<%=varForumName%>"</font><br>
	 <%=funLogicDate(varLastEntryDate)%> &nbsp;<font color=cccccc>|</font>&nbsp;
	 Läst <%=varViewsNum%> ggr. &nbsp;<font color=cccccc>|</font>&nbsp;
	  <a href="/web2005/forum/forum_posts.asp?TID=<%=varId%>&PN=1">Läs...</a><br><br>
	 </div>

Vill alltså lägga till en rad så det även framgår vilken person som postde.

Medlem sedan dec. 200012 464 inlägg
#11

Du saknar ett , efter no_of_views i SQL-satsen

Medlem sedan maj 20012 080 inlägg
#12

Ahhhh... visst var det det.

Ett följdfel:

Microsoft JET Database Engine error '80004005'

At most one record can be returned by this subquery.

/web2005/_design/latest_blog/_inc_show_newest_threads.asp, line 42

Line 42 =
<% rs.movenext
wend %>

Detta felmeddelande har jag inte sett tidigare ???

Min fråga ser nu ut så här:

sql = "SELECT TOP 3 Subject, Forum_name, Last_entry_date, No_of_views, Topic_ID, "
sql = sql & "(select Username "
sql = sql & " from tblAuthor a "
sql = sql & " inner join tblThread th on a.Author_ID = th.Author_ID "
sql = sql & " where th.Topic_ID  = t.Topic_ID) as lastAuthor "
sql = sql & "  FROM tblTopic t "
sql = sql & "  LEFT JOIN tblForum f ON t.Forum_ID = f.Forum_ID "
sql = sql & "  ORDER BY t.Last_entry_date DESC "
'sql = "SELECT TOP 3 * FROM tblTopic "
'sql = sql &" LEFT JOIN tblForum "
'sql = sql &" ON tblTopic.Forum_ID = tblForum.Forum_ID "
'sql = sql &" ORDER BY tblTopic.Last_entry_date DESC"
response.write sql
set rs = objConn.execute(sql)
while not rs.eof 
varLastAuthor = rs("lastAuthor")
varSubject = rs("Subject")
varLastEntryDate = rs("Last_entry_date")
varViewsNum = rs("No_of_views")
varId = rs("Topic_ID")
varForumName = rs("Forum_name")
%>
Medlem sedan maj 20012 080 inlägg
#13

Om jag har fler än TOP 2 i frågan så får jag fel. Hur kan det komma sig???

SELECT TOP 2 ... Fungerar
SELECT TOP 4 ... Fungerar EJ

Medlem sedan dec. 200012 464 inlägg
#14

Problemet är när det finns flera poster i tblThreads för samma topic och då måste man lägga till villkor så att man bara tar det med högst thread_id.

SELECT TOP 3 Subject, Forum_name, Last_entry_date, No_of_views, username as lastAuthor
 FROM (((tblForum f
 inner join tblTopic t ON f.Forum_ID = t.Forum_ID)
 inner join tblThread th on t.topic_id = th.topic_id)
 inner join tblAuthor a on th.author_id = a.author_id
 where th.thread_id in (
    select max(thread_id)
      from tblThread th2
     where th.topic_id = th2.topic_id)
 ORDER BY t.Last_entry_date DESC

Varför hade du en left join mellan forum och topic? Alla topic tillhör väl något forum?

Medlem sedan maj 20012 080 inlägg
#15

Jag tänkte nog inte så mycket. Det är nog anledningen. Blir förvirrad ibland ;)

sql = "SELECT TOP 3 Subject, Forum_name, Last_entry_date, No_of_views, username as lastAuthor "
sql = sql &" FROM (((tblForum f "
sql = sql &" inner join tblTopic t ON f.Forum_ID = t.Forum_ID) "
sql = sql &" inner join tblThread th on t.topic_id = th.topic_id) "
sql = sql &" inner join tblAuthor a on th.author_id = a.author_id "
sql = sql &" where th.thread_id in ( "
sql = sql &" select max(thread_id) "
sql = sql &" from tblThread th2 "
sql = sql &" where th.topic_id = th2.topic_id) "
sql = sql &" ORDER BY t.Last_entry_date DESC "

Får syntax error på ovan. Använder Access som databas. :)

Medlem sedan dec. 200012 464 inlägg
#16

Det blev en parentes för mycket efter FROM

sql = "SELECT TOP 3 Subject, Forum_name, Last_entry_date, No_of_views, username as lastAuthor "
sql = sql &" FROM ((tblForum f "
sql = sql &" inner join tblTopic t ON f.Forum_ID = t.Forum_ID) "
sql = sql &" inner join tblThread th on t.topic_id = th.topic_id) "
sql = sql &" inner join tblAuthor a on th.author_id = a.author_id "
sql = sql &" where th.thread_id in ( "
sql = sql &" select max(thread_id) "
sql = sql &" from tblThread th2 "
sql = sql &" where th.topic_id = th2.topic_id) "
sql = sql &" ORDER BY t.Last_entry_date DESC "
Medlem sedan maj 20012 080 inlägg
#17

Snällt att du håller ut. Fungerar alldeles utmärkt. Jag behöver även få ut Topic_ID.

Var ska den in i frågan. Topic_ID finns i flera tabeller.

Medlem sedan dec. 200012 464 inlägg
#18
SELECT TOP 3 Subject, Forum_name, Last_entry_date, No_of_views, username as lastAuthor , t.topic_id "

t.ex.

Medlem sedan maj 20012 080 inlägg
#19

Vad kallar man t, th, a i detta sammanhang? Antar att de är som en variabel som kan vara vilket namn som helst?

OFF TOPIC:
Skulle vara kul med något system med virtuella krediter i detta forum. Du får i alla fall 50 krediter av mig för all hjälp. !
Hjälper man någon så hamnar man eventuellt på + Behöver man mycket hjälp får man mindre... en ide bara... :)

Medlem sedan dec. 200012 464 inlägg
#20

Vad kallar man t, th, a i detta sammanhang?

De flesta använder termen alias,

262 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)