Avatar billede fanatic Nybegynder
06. oktober 2007 - 23:07 Der er 16 kommentarer og
1 løsning

Brug af Count og select i samme query

Hej eksperter.

Jeg er ved at lave en blog i asp.net og Access. På bloggen vises en række nyheder. Til hver nyhed kan der tilføjes kommentarer fra sidens læsere. På siden vises nyhederne i en repeater-kontol, samtidig med dette vil jeg gerne have at der står til hver nyhed, hvor mange kommentarer der tilføjet på den.

Derfor har jeg rodet mig ud i følgende SQL:

SELECT COUNT(c.commentAuthor)AS NumberOfComments, n.newsTitle, n.newsCreateDate, n.newsMessage, n.newsAuthor, n.newsId FROM News n, Comment c

WHERE n.newsId = c.commentNewsId

GROUP BY n.newsTitle, n.newsCreateDate, n.newsMessage, n.newsAuthor, n.newsId

ORDER BY n.newsCreateDate DESC";

Problemet er bare at jeg ikke får vist alle nyhederne! Dog vises det korrekte antal kommentarer til hver nyhed. Kan i se hvad der er galt i min SQL siden den ikke viser alle nyheder?

Jeg har to tabeller i Access, en der hedder news og en der hedder comment.
Avatar billede erikjacobsen Ekspert
06. oktober 2007 - 23:10 #1
Kan det tænkes den ikke viser nyheder, hvor der ikke er kommentarer?
Avatar billede fanatic Nybegynder
06. oktober 2007 - 23:26 #2
Ja, det ser faktisk sådan ud... hmm, hvordan takler jeg mon det, nogle ideer?
Avatar billede erikjacobsen Ekspert
06. oktober 2007 - 23:41 #3
Ok. Det er fordi

WHERE n.newsId = c.commentNewsId

kun tager noget med, hvis der en "match" i de to tabeller. Og det er der jo ikke, hvis der ikke er nogen kommentarer endnu. ***FANFARE*** Så kommer "LEFT JOIN" til undsætning. Ret:

FROM News n, Comment c WHERE n.newsId = c.commentNewsId

til

FROM News n LEFT JOIN Comment c ON n.newsId = c.commentNewsId

Selv om der ikke er en kommentar i Comment, så kommer der en række med NULL-felter. Og COUNT(...) kan ikke tælle NULL-er. Heureka ...
Avatar billede fanatic Nybegynder
07. oktober 2007 - 00:23 #4
Perfekt, det virker!!! ;-)

Læg lige et svar og 1000 tak for hjælpen.
Avatar billede erikjacobsen Ekspert
07. oktober 2007 - 00:29 #5
Jeg samler slet ikke på point, tak. Svar selv, accepter eget svar.

Nu kunne jeg forestille mig, at du oftere viser listen med nyheder og kommentarer, end der kommer nye nyheder og kommentarer. Det kan godt blive en lidt tung affære, at hente de oplysninger ud hver gang listen skal vises.

Du kunne overveje at have et felt i "News" hvor du holder styr på antallet af kommentarer. Det skal selvfølgelig tælles op, når der lægges en kommentar.

Du får altså en smule mere computerarbejde ved opdatering, men meget mindre ved visning.
Avatar billede fanatic Nybegynder
07. oktober 2007 - 14:31 #6
Hej Erik.

Ja det havde jeg ikke tænkt på. Det er selvfølgelig den måde jeg skal gøre det på, tak.

Jeg tænkte... hvis vi nu antager at jeg også har en tabel som hedder "Picture", som indeholder billeder knyttet til hver blog-indlæg, hvordan kan man, samtidig med visning af indlæg + kommentarer, få vist et antal billeder (tumbnails) til hvert indlæg også? Se evt. http://www.unsafe.dk/

Min "Picture"-tabel kunne have følgende attributer: pictureId, pictureTitle, pictureNewsId, pictureUrl, pictureMessage.

Den metode i ASP.NET som laver den forespørgsel vi snakkede om sidst er vist her:

    public static DataSet ViewNews()
    {
        string sql;
        DataSet myData;
        sql = "SELECT COUNT(c.commentAuthor)AS NumberOfComments, n.newsTitle, n.newsCreateDate, n.newsMessage, n.newsAuthor, n.newsId FROM News n LEFT JOIN Comment c ON n.newsId = c.commentNewsId GROUP BY n.newsTitle, n.newsCreateDate, n.newsMessage, n.newsAuthor, n.newsId ORDER BY n.newsCreateDate DESC";
        myData = DataControl.GetDataSet(sql);
       
        myData = ReplaceCustomTagsWithHtml(myData);

        return myData;
    }

Har du nogle ideer hertil?
Avatar billede erikjacobsen Ekspert
07. oktober 2007 - 14:38 #7
Jeg ville nok tage en separat SELECT til billederne.
Avatar billede fanatic Nybegynder
09. oktober 2007 - 21:31 #8
Hej Erik.

Jeg har fundet ud af at når jeg benytter overstående SQL:
SELECT COUNT(c.commentAuthor)AS NumberOfComments, n.newsTitle, n.newsCreateDate, n.newsMessage, n.newsAuthor, n.newsId FROM News n LEFT JOIN Comment c ON n.newsId = c.commentNewsId GROUP BY n.newsTitle, n.newsCreateDate, n.newsMessage, n.newsAuthor, n.newsId ORDER BY n.newsCreateDate DESC

Så udskrives der højst 2 linjers tekst af n.newsMessage til trods for at det er et MEMO-felt.

Benytter jeg følgende simplificerede SQL:
SELECT n.newsTitle, n.newsCreateDate, n.newsMessage, n.newsAuthor, n.newsId FROM News n ORDER BY n.newsCreateDate DESC

Så skriver den alt teksten ud på n.newsMessage feltet. Desværre får jeg jo så ikke talt antallet af kommentarer til nyheden.

Har du nogen ide om hvorfor alt teksten ikke skrives ud i den første? Er der en eller anden property man kan sætte på databasen?
Avatar billede erikjacobsen Ekspert
10. oktober 2007 - 08:42 #9
Når du laver en GROUP BY på et "memo"-felt, kortes den af.
Avatar billede fanatic Nybegynder
11. oktober 2007 - 18:46 #10
Hej Erik.

tak for dit svar. Men jeg bliver nød til at lave en group by på memo-feltet, ellers virker det ikke med den der count som du hjalp mig med?
Avatar billede erikjacobsen Ekspert
11. oktober 2007 - 18:59 #11
Så kunne det vel være en god grund til at gøre som i 07/10-2007 00:29:30
Avatar billede fanatic Nybegynder
11. oktober 2007 - 19:08 #12
ja... det er nok måden at gøre det på. Tak! Sender du ikke lige et svar så jeg kan lukke tråden? Og endnu engang tak for hjælpen!!
Avatar billede erikjacobsen Ekspert
11. oktober 2007 - 19:32 #13
Nej tak.
Avatar billede fanatic Nybegynder
11. oktober 2007 - 22:09 #14
ok da ;-)
Avatar billede fanatic Nybegynder
12. oktober 2007 - 20:39 #15
Hej Erik.

Jeg er stødt på et problem til efter at jeg er ved at ændre min kode til det du forelog. I forbindelse med at indsætte en kommentar til en nyhed gør jeg følgende:
Først henter jeg newsCommentsNumber fra News-tabellen med en select. Derefter tæller jeg newsCommentsNumber en op og herunder prøver jeg at indsætte det igen:


"INSERT INTO News (newsCommentsNumber) VALUES (" + commentsNumber + ") WHERE newsId = " + newsId + ";";

Med debuggeren får jeg følgende sql som sendes til db'en:

INSERT INTO News (newsCommentsNumber) VALUES (1) WHERE newsId = 23

Jeg får dog fejlen:

Der mangler et semikolon (;) i slutningen af SQL-sætningen.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.OleDb.OleDbException: Der mangler et semikolon (;) i slutningen af SQL-sætningen.

Har du en ide til hvad der er galt? Jeg forstår ikke fejlen, jeg har jo ; i slutningen så det må være noget andet...eller hvad?
Avatar billede erikjacobsen Ekspert
12. oktober 2007 - 21:52 #16
Du skal sikkert bruge en UPDATE, og ikke en INSERT
Avatar billede fanatic Nybegynder
12. oktober 2007 - 23:59 #17
ja det er da fuldstændig klart!!! Jeg er ved at være træt..hård uge, tak for hjælpen endnu engang ;-)
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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

IT-JOB