Avatar billede eksperten1 Nybegynder
25. juli 2008 - 09:52 Der er 5 kommentarer

COUNT antal indlæg pr. bruger

Jeg har 2 tabeller -

shoutbox
-----
id (int)
ts (timestamp)
userid (int)
shout (text)

user
-----
id (int)
name (varchar)

Jeg vil gerne lave et query, hvor jeg får de ex. 25 seneste indlæg fra shout, hvilken bruger der har skrevet indlægget - samt (det jeg ikke kan finde ud af) hvor mange indlæg denne bruger har skrevet:

Her er hvad jeg er nået til :
SELECT b.name,a.ts,a.shout, b.id,md5(a.id), COUNT(b.id) FROM shoutbox a LEFT JOIN users b ON a.userid = b.id GROUP BY (a.id) ORDER BY a.ts desc

Problemet er at jeg bare får 1 i COUNT - og det er jo fordi der kun er skrevet 1 indlæg fra denne bruger - med dette id

Jeg kunne virkelig godt bruge en hjælpende hånd her :-)
Avatar billede erikjacobsen Ekspert
25. juli 2008 - 09:57 #1
Du kan gøre det med 2 forespørgsler. Men hvad med at udvide user-tabellen med et felt til antal indlæg?
Avatar billede eksperten1 Nybegynder
25. juli 2008 - 10:03 #2
erik - nogle gange skal man bare gøre det nemt for en selv :-) Det gør jeg da bare

doh!
Avatar billede erikjacobsen Ekspert
25. juli 2008 - 10:10 #3
En anden god grund til at gøre det sådan er at der sandsynigvis bliver spurgt på antal indlæg (dvs. visninger) mange flere gange en antallet ændres (opdateringer).

Selv om du på denne måde får redundans i dine data (antallet kan aflæses ved at tælle i shoutbox-tabellen, og i user-tabellen), så kører det hurtigere.

Opdatering af tabellerne shoutbox og user bør så til gengæld ske i en transaktion, så du er sikker på de begge bliver ændret.
Avatar billede Slettet bruger
25. juli 2008 - 10:11 #4
Ellers kan du bruge inner select. Det performer ikke helt så godt, hvis du har mange brugere, men så slipper du for afledet data.

SELECT
    `user`.`name`,
    `shoutbox`.`ts`,
    `shout`.`shout`,
    `shout`.`id`,
    `entries`.`entries`
FROM
    `shoutbox` LEFT JOIN `user` ON (
        `shoutbox`.`userid` = `user`.`id`
    ) LEFT JOIN (
        SELECT
            COUNT() AS `entries`,
            `userid`
        FROM
            `shoutbox`
        GROUP BY
            `userid`
    ) AS `entries` ON (
        `user`.`id` = `entries`.`userid`
    )
ORDER BY
    `shoutbox`.`ts` DESC
Avatar billede gnoname Praktikant
25. juli 2008 - 12:27 #5
Ja, jeg ville nu bare counte '*' istedet for b.id:

SELECT b.name,a.ts,a.shout, b.id,md5(a.id), COUNT(*)
FROM shoutbox a
LEFT JOIN users b ON a.userid = b.id
GROUP BY (a.id)
ORDER BY a.ts desc
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