Avatar billede tinaw25 Nybegynder
17. februar 2013 - 13:36 Der er 5 kommentarer og
1 løsning

kan man bruge eval count til at tælle i repeater?

Hej

Så den gal igen, jeg er ved at lave en blog fra bunden, og er stødt ind i et problem som jeg ikke ved hvordan man løser.

I mit indlæg har jeg en tabel der hedder:
CREATE TABLE [dbo].[indlaeg] (
    [indlaeg_ID]    INT          IDENTITY (1, 1) NOT NULL,
    [fk_katogori_ID] INT          NOT NULL,
    [overskrift]    VARCHAR (50) NOT NULL,
    [navn]          VARCHAR (50) NOT NULL,
    [tekst]          TEXT        NOT NULL,
    [dato_indlaeg]  DATETIME    NOT NULL,
    [billede]        VARCHAR (50) NULL,
    PRIMARY KEY CLUSTERED ([indlaeg_ID] ASC)
);

Og til kommentar

CREATE TABLE [dbo].[kommentar] (
    [kommentar_ID]  INT          IDENTITY (1, 1) NOT NULL,
    [fk_indlaeg_ID] INT          NOT NULL,
    [dato]          DATETIME    NOT NULL,
    [navn]          VARCHAR (50) NOT NULL,
    [kommentar]    TEXT        NOT NULL,
    PRIMARY KEY CLUSTERED ([kommentar_ID] ASC)
);

Mit indlæg på siden, ser sådan her ud:

LØRDAG
23
april, 11
Det nye legetårn indvies Skrevet af: Tina Nu er det nye legetårn endelig blevet færdigt, og det er han bare så glad for. Vi har i dag været de Læs mere....
Kommentar: (67)    Katogori:

Jeg ville gerne tælle hvor mange kommentar der er skrevet inde i parantesen, men jeg kan simpelthen ikke dreje hvordan jeg lige skal gøre det. I min kode ser det sådan her ud:

<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT * FROM indlaeg
INNER JOIN katogori ON indlaeg.fk_katogori_ID = katogori.kato_ID
INNER JOIN kommentar ON kommentar.kommentar_ID = indlaeg.indlaeg_ID"></asp:SqlDataSource>
<asp:DataList runat="server" DataSourceID="SqlDataSource2" OnItemDataBound="DataList1_ItemDataBound">
    <ItemTemplate>
      <br /><br />
          <div class="blog_kalender"><!--blog_kalender start -->
<p class="kalender_top"><%#Eval("dato_indlaeg", "{0:dddd}") %></p>
<p class="kalender_midt"><%#Eval("dato_indlaeg", "{0:dd}") %></p>
<p class="kalender_ned"><%#Eval("dato_indlaeg", "{0:MMMM, yy}") %></p>
                </div><!--blog_kalender end -->
             
            <h1 class="blog_overskrift"><%#Eval("overskrift") %></h1>
            <p class="blog_hvem">Skrevet af: <%#Eval("navn") %></p>
            <p class="blog_tekst"><%# Eval("tekst").ToString().Substring(0, Math.Min(Eval("tekst").ToString().Length, 100)) %></p>
            <p class="laes_mere"><a href="VisBlognyhed.aspx?indlaeg_ID=<%#Eval("indlaeg_ID") %>">Læs mere....</a></p>
           
              <table class="tabel" border="1" width="500">
                <tr>
                    <td>Kommentar: (<%# Eval("kommentar").ToString().Count() %>)</td>
                    <td>Katogori:</td>
                </tr>

                </table>
               
           
            </ItemTemplate>

                </asp:DataList>
               

Håber der er nogle der kan hjælpe!!
17. februar 2013 - 21:27 #1
tinaw25, vi aftalte andetsteds, at jeg skulle komme ind her.  Men måske var jeg for hurtig.  Spørgsmålet var oprettet i kategorien MS SQL.  Jeg spottede ikke i tide, at du i din applikation anvender asp, som jeg ikke kender så meget til.  Men nu prøver jeg:

Din query er:
SELECT *
FROM indlaeg
INNER JOIN katogori ON indlaeg.fk_katogori_ID = katogori.kato_ID
INNER JOIN kommentar ON kommentar.kommentar_ID = indlaeg.indlaeg_ID

Dette er udenfor spørgsmålet, men jeg ser to problemer med denne query:

For det første ville jeg mene at joinen mellem kategori og kommentar skulle være ON kommentar.fk_indlaeg_ID = indlaeg.indlaeg_ID.

For det andet, hvis du bruger inner join mellem indlaeg og kommentar får du ikke indlaeg med hvor der endnu ingen kommentarer er.  Jeg vil foreslå der at bruge LEFT OUTER JOIN.  (Den første INNER JOIN er ok hvis alle indlæg hører til en kategori.)

Altså jeg foreslår, at du i første omgang ændrer queryen til:

SELECT *
FROM indlaeg
INNER JOIN katogori ON indlaeg.fk_katogori_ID = katogori.kato_ID
LEFT OUTER JOIN kommentar ON kommentar.fk_indlaeg_ID = indlaeg.indlaeg_ID

Hvis du skal bruge antal kommentarer der hører til et indlæg vil jeg foreslå, at du søger efter det med en subquery således:

(SELECT COUNT(*) FROM kommentar WHERE fk_indlaeg_ID = indlaeg.indlaeg_ID) AS antal

Det indføjer du i queryen således:

SELECT *, (SELECT COUNT(*) FROM kommentar WHERE fk_indlaeg_ID = indlaeg.indlaeg_ID) AS antal
FROM indlaeg
INNER JOIN katogori ON indlaeg.fk_katogori_ID = katogori.kato_ID
LEFT OUTER JOIN kommentar ON kommentar.fk_indlaeg_ID = indlaeg.indlaeg_ID

Så vil resultatet af din query, for hvert indlæg, indeholde et felt 'antal' med antallet af kommentarer for det query. 

Og nu er jeg nødt til at gætte lidt, jeg håber det går godt.  Men i stedet for at sige:

<td>Kommentar: (<%# Eval("kommentar").ToString().Count() %>)</td>

vil jeg foreslå du prøver med

<td>Kommentar: (<%# Eval("antal") %>)</td>

Så en sidste kommentar:  Du kan lave din query kortere, og derved mere oversigtelig, ved at observere følgende:

I stedet for INNER JOIN kan du bruge JOIN.  I stedet for LEFT OUTER JOIN kan du bruge LEFT JOIN.  og du kan give tabellerne alias'er (øgenavne) for eksempel således:

SELECT *, (SELECT COUNT(*) FROM kommentar WHERE fk_indlaeg_ID = i.indlaeg_ID) AS antal
FROM indlaeg i
JOIN katogori ka ON i.fk_katogori_ID = k.kato_ID
LEFT JOIN kommentar ko ON ko.fk_indlaeg_ID = i.indlaeg_ID
Avatar billede tinaw25 Nybegynder
18. februar 2013 - 08:08 #2
Tak for svaret, jeg vil prøve det af senere. Men det lyder ret logisk
Avatar billede tinaw25 Nybegynder
18. februar 2013 - 11:21 #3
Den virker, og den tæller kommentar rigtigt. Men nu laver den indlæg dobbelt. Så den viser det indlæg det antal gange som der er blevet skrevet en kommentar til?

Gav det mening?
18. februar 2013 - 21:01 #4
Ok, jeg kikker nu på dit oprindelige indlæg.  Når du udskriver dit indlæg, så er det eneste du vil vide om kommenarer hvor mange der er.  Så du kan undlade i din query at søge efter kommentar detaljer.

Nu er jeg igen handikappet af mit begrænsede kendskab til asp, men fra et MS SQL perspektiv vil jeg mene du vil få det ønskede resultat med en query som denne:

SELECT *, (SELECT COUNT(*) FROM kommentar WHERE fk_indlaeg_ID = i.indlaeg_ID) AS antal
FROM indlaeg i
JOIN katogori ka ON i.fk_katogori_ID = k.kato_ID
Avatar billede tinaw25 Nybegynder
18. februar 2013 - 22:33 #5
Kanon, det virker tusind tak for hjælpen. Havde ikke lige tænkt på at jeg skulle have en where ind og fjerne join med kommentar.

Det er meget godt klaret, hvis du siger du er handikappet til det.

Smid et svar
19. februar 2013 - 07:45 #6
Svar.
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