webForumDet fria alternativet

Räkna kommentarer på en nyhet

.NET

16 svar · 580 visningar · startad av MagnusJ

Medlem sedan apr. 2004150 inlägg
Frågan#1

Hej

Jag undrar lite över hur man kan räkna ut hur många kommentarer det finns till en nyhet.

Jag listar alla nyheter på första sidan och där ska man se hur många kommentarer nyheten har.

Jag har byggt upp databasen så att det är en tabell för nyheterna och en annan tabell för kommentarerna. Tabellen med kommentarerna har en kolumn som heter newsID där id:et för nyheten är och på så sätt ska jag koppla ihop så att rätt kommentar är till rätt nyhet.

Jag använder mig av access. Jag undrar lite över hur man ska fixa det ifall det går att fixa i sql kopplingen när man hämtar inläggen. Fast det kanske inte går, men vet någon hur man kan göra?

Medlem sedan dec. 20025 483 inlägg
#2

Hur ser SQL-frågan ut nu?

Medlem sedan juli 2003465 inlägg
#3

Du kan ju loopa ut alla nyheter och i den loopen så gör du en fråga som hämtar antalet kommentarer från det idt som den är på i loopen...

Medlem sedan jan. 20012 204 inlägg
#4

Om du fyller ditt resultat till ett dataset/datatable så hittar du antalet rader, om det nu är samma som antalet kommentarer i dt.Rows.Count etc

Medlem sedan apr. 2004150 inlägg
#5

Så här ser min sql-fråga ut som jag har nu, men den hämtar bara alla nyheter.

public DataSet GetEntrys() 
{
		try
		{
			string strSQL = "SELECT * FROM tbl_news ORDER BY nID DESC";
			return GetNewDataSet(strSQL);
		}
		catch (Exception)
		{
			throw;
		}
}

Går det på nått sätt göra en sql-fråga där man innerjoinar tbl_news_comments i frågan sedan räknar man antalet poster där kolumnen newsID stämmer överens med nyhetes ID.

Jag är inte så jätte vass på sql-frågor, så jag vet inte riktigt hur man ska göra den frågan, om det äns går.

Medlem sedan dec. 200471 inlägg
#6

Jag gör följande på min hemsida för att plocka ut nyhetsid, rubrik, datum, innehåll, skribentid, skribentnamn och antal kommentarer från de 10 senaste nyheterna:

"select n.nid, n.nHeadline, n.ndate, n.ncontent, u.uuserid, u.uname, count(c.cid) as comments from tblalternianews n left join tblalterniausers u on (n.nwriterid=u.uUserid) left join tblalterniacomments c on (c.cNewsId=n.nid) group by n.nid order by n.nid desc LIMIT 10"

där n. = alias för nyhetstabellen, u. = alias för användartabellen och till sist c. = alias för kommenteringstabellen.

Medlem sedan juni 20019 024 inlägg
#7

Liten renskrivning av SebbeJ:s kod:

   SELECT news.*, COUNT(comments.*) AS comments
     FROM news
LEFT JOIN comments ON (comments.newsid = news.newsid)
 GROUP BY news.newsid
Medlem sedan dec. 200471 inlägg
#8

Använd _aldrig_ select *, men din renskrivning visar iaf syftet med sql-satsen tydligare.

Medlem sedan nov. 20022 355 inlägg
#9

SebbeJ skrev:

Använd _aldrig_ select *, men din renskrivning visar iaf syftet med sql-satsen tydligare.

Varför inte? :q

Medlem sedan apr. 2004150 inlägg
#10

Jag får det här felmeddelandet:

Du försökte köra en fråga med en mängdfunktion som inte innehöll det angivna uttrycket 'nHeadline'.

Kod:
string strSQL = "SELECT tbl_news.nID, tbl_news.nHeadline, tbl_news.nContent, COUNT(tbl_news_comments.cnID) AS tbl_news_comments FROM tbl_news LEFT JOIN tbl_news_comments ON (tbl_news_comments.cnID = tbl_news.nID) GROUP BY tbl_news.nID ORDER BY tbl_news.nID desc";

Vad kan det bero på?
Hur gör man för att dela upp frågan på flera rader?

Sedan undrar jag vad man ska skriva för att få ut hur många kommentarer det är på aspx-sidan. Lägger sig resultatet av Count i någon speciellsträng?

Medlem sedan dec. 20025 483 inlägg
#11

Mc Fetto skrev:

SebbeJ skrev:

Använd _aldrig_ select *, men din renskrivning visar iaf syftet med sql-satsen tydligare.

Varför inte? :q

Antag att du modifierar tabellen genom att, säg, lägga till en kolumn och att denna kolumn inte är av intresse i SQL-frågan. Då måste du ersätta '*' med endast de önskade kolumnerna, vilket kan bli en hel del (framför allt om tabellen är onormaliserad). Dessutom kanske ändringarna måste göras på flera ställen.

Medlem sedan nov. 20022 355 inlägg
#12

Peter S skrev:

Mc Fetto skrev:

SebbeJ skrev:

Använd _aldrig_ select *, men din renskrivning visar iaf syftet med sql-satsen tydligare.

Varför inte? :q

Antag att du modifierar tabellen genom att, säg, lägga till en kolumn och att denna kolumn inte är av intresse i SQL-frågan. Då måste du ersätta '*' med endast de önskade kolumnerna, vilket kan bli en hel del (framför allt om tabellen är onormaliserad). Dessutom kanske ändringarna måste göras på flera ställen.

Det är sant, det jag reagerade på var att man Alldrig ska använda sig utav det. Alltså är det en smaksak ;)

Medlem sedan dec. 20025 483 inlägg
#13

Ja, "aldrig" kanske var att ta i. Vill man alltid ha med samtliga kolumner är det ju bara att köra på.

Medlem sedan dec. 20025 483 inlägg
#14

MagnusJ, testa denna:

select n.nid, n.nheadline, n.ncontent, iif(c.total is null, 0, c.total) as comments 
from tbl_news n 
left join (select cnid, count(*) as total 
    from tbl_news_comments 
    group by cnid) as c 
  on n.nid = c.cnid;
Medlem sedan apr. 2004150 inlägg
#15

Tack, det där verkar fungera.

Hur gör man för att skriva ut sql-frågan på flera rader? Eller går det bara i SP?

Men vad ska jag skriva i .aspx sidan för att veta hur många kommentarer nyheten har?

Medlem sedan dec. 20025 483 inlägg
#16

Nu kan jag inte ASP.NET, men delar man inte upp en sträng på flera rader så här:

"..." & _
"..."

Alternativt:

"..." + 
"..."

Antalet kommentarer hämtar du på samma sätt som du hämtar en "vanlig" kolumn. I den kod jag postade heter denna kolumn comments.

Medlem sedan apr. 2004150 inlägg
#17

Det fungerade, tack så mycket för hjälpen!

259 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
116 ms — ändringar (db)