Avatar billede iq-n Nybegynder
08. maj 2008 - 14:50 Der 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
Avatar billede runesoft Nybegynder
10. maj 2008 - 13:07 #1
du kan bare lave din sidste select som en sub select. Altså en select der selecter en værdi ud til dine ydre selects
Avatar billede janus_007 Nybegynder
11. maj 2008 - 20:06 #2
hej iq-n

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.
Avatar billede iq-n Nybegynder
13. maj 2008 - 12:11 #3
Tak Janus 007

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";
}

Smid et svar for point
Avatar billede janus_007 Nybegynder
13. maj 2008 - 18:39 #4
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

Godt du fik det til at virke :)
Avatar billede iq-n Nybegynder
14. maj 2008 - 12:14 #5
Ja, tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester