08. maj 2008 - 14:50Der er
4 kommentarer og 1 løsning
Få et Count fra en database i relationship
Hej alle
Jeg er ved at lave en blog, og magler kun at få den til at skrive hvor mange kommentare der er skrevet til den enkelte blog.
Selve SQL sætningen hedder: SELECT * FROM (SELECT TOP " + intAntalLinier + " * FROM (SELECT TOP " + intSideNr + " * FROM kobbersholtBlog, kobbersholtBlogBruger WHERE kobbersholtBlog.blogBrugerID = kobbersholtBlogBruger.brugerID ORDER BY blogID DESC) AS toptabel ORDER BY blogID ASC) AS Nyheder ORDER BY blogID DESC
Alle de SELECT sætninger er for at kunne få vist de nyeste alt efter hvilken side man er på.
min kode hedder nu: objConnection.Open();
strSQL = "SELECT * FROM (SELECT TOP " + intAntalLinier + " * FROM (SELECT TOP " + intSideNr + " * FROM kobbersholtBlog, kobbersholtBlogBruger WHERE kobbersholtBlog.blogBrugerID = kobbersholtBlogBruger.brugerID ORDER BY blogID DESC) AS toptabel ORDER BY blogID ASC) AS Nyheder ORDER BY blogID DESC"; //Response.Write(strSQL); OurCommand = new SqlCommand(strSQL, objConnection); dr = OurCommand.ExecuteReader(); while (dr.Read()) { lblBloggene.Text += "<div id='Blog'>"; lblBloggene.Text += "<a href='blog.aspx?ID=" + dr["blogID"].ToString() + "' >"; lblBloggene.Text += "<h1>" + dr["blogOverskrift"].ToString() + "</h1></a>"; lblBloggene.Text += "<p class='graa'>Skrevet af " + dr["BrugerNavn"].ToString() + ", d. " + dr["blogDato"].ToString() + "</p>"; lblBloggene.Text += "<img src='images/blogbilleder/" + dr["blogBillede"].ToString() + "' border='0' /><br /><br />"; lblBloggene.Text += "<p>" + dr["blogTekst"].ToString() + "</p><br />"; lblBloggene.Text += "<a href='blog.aspx?ID=" + dr["blogID"].ToString() + "'>"; lblBloggene.Text += "Læs/skriv kommentar</a>"; //strSQL2 = "SELECT COUNT(*) AS nummer FROM kobbersholtBlogKommentar WHERE kommentarBlogID = " + dr["blogID"].ToString(); //OurCommand2 = new SqlCommand(strSQL, objConnection); //dr2 = OurCommand.ExecuteReader(); //while (dr2.Read()) //{ // lblBloggene.Text += "(" + dr["nummer"].ToString() + ")"; //} lblBloggene.Text += "</div>"; }
objConnection.Close();
Som i kan se har jeg jeg prøvet at køre endnu en select sætning ind over det, men den kræver selvfølgelig at jeg lukker den anden først.
Jeg opretter samme spørgsmål i ASP.Net fordi jeg ikke kan finde ud af om problemet skal løses i ASP.Net eller SQL
Jeg forstår ikke hvorfor du laver så mange top-selects, jeg har skrevet din sql lidt renere og samtidigt smidt en count ind i den, det håber jeg er i orden :-)
select top 100 kb.*, kbb.*, p.kommentarCount from kobbersholtBlog kb inner join kobbersholtBlogBruger kbb on kbb.brugerID = kb.blogBrugerID left outer join (select count(*) as kommentarCount, kommentarBlogID from kobbersholtBlogKommentar group by kommentarBlogID ) as p on p.kommentarBlogID = kb.blogID
Hvis SQL'en ikke lige gør hvad der forventes (det er muligt jeg har misforstået), så spørg endelig løs.
Derudover vil jeg anbefale dig at overholde en vist system i din kode, nu kan jeg se det er meget hobbypræget, men derfor er det alligevel en god idé eks.vis at benytte sig af et datalag. Det simpleste du kan gøre er at benytte dig af et DataSet og så arbejde spørge til de objekter istedet for at iterere over med en datareader over en åben connection.
Det virker næsten som jeg ønskede. Grunden til jeg har de top-selects i strengen er for at kunne få den til at vise de 10 nyeste (intAntalLinier) blogs, alt efter hvilken side (intSideNr = 10) man er på. Så når man kommer til næste side viser den blog 11 til 20 (intSideNr = 20)
Så den opdateret streng ser sådan ud: SELECT * FROM (SELECT TOP " + intAntalLinier + " * FROM (SELECT TOP " + intSideNr + " kb.*, kbb.*, p.kommentarCount FROM kobbersholtBlog kb INNER JOIN kobbersholtBlogBruger kbb ON kbb.brugerID = kb.blogBrugerID left outer join (SELECT COUNT(*) AS kommentarCount, kommentarBlogID FROM kobbersholtBlogKommentar GROUP BY kommentarBlogID) AS p ON p.kommentarBlogID = kb.blogID ORDER BY blogID DESC) AS Bloggen ORDER BY blogID ASC) AS Blog ORDER BY blogID DESC
Hvis du har en mere simpel måde at gøre det på, må du meget gerne sige til.
Jeg bruger også DataSet en gang imellem, men bruger ofte datareader for større frihed i programmeringen. I dette tilfælde har jeg tilføjet dette til den:
if (dr["kommentarCount"].ToString() != "") { lblBloggene.Text += "<br />Denne blog har " + dr["kommentarCount"].ToString() + " kommentarer"; }
ahh okay på den måde, desværre understøtter SQL2000 ikke det du gerne vil :-( Det har også irriteret mig en del, men så fandt jeg ud af at man kunne lave noget caching i eks.vis DataSettet - det gjorde mig lidt gladere, men det er stadig ikke optimalt synes jeg *S* Ellers skal man skifte til SQL2005/08
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.