17. februar 2013 - 13:36Der 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:
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:
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
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?
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
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.