Tæl Rækker

Her fortæller jeg om det at tælle forekomster i SQL.

Man kan tælle rækker på to måder, enten så vælger man de data der skal med, ellers bruger man "COUNT(*)", først viser jeg hvordan man bruger den nemmeste måde, hvis du også skal bruge de data du henter, PHP er involveret, Først SQL kaldet.

SELECT brugerid, brugernavn
FROM bruger
WHERE brugeraktiv = 'Ja';

Vi vælger her data fra to felter i tabellen bruger, hvor et tredje felt har en påkrævet værdi, så alle der har "brugeraktiv" sat til "Ja" vil blive retuneret.

Til en smule PHP, jeg viser blandet hvordan man åbner en forbindelse til MySQL ved hjælp af PHP og modulet mysqli.

<?php
$db = new mysqli ($hostname, $username, $password, $database);
$sql = "SELECT brugerid, brugernavn FROM bruger WHERE brugeraktiv = 'Ja'";
$resbruger = $db->query ($sql);
$numbruger = $resbruger->num_rows;
echo ($numbruger . " brugere fundet");
?>

Bemærk at det ikke er en god ide at bruge denne metode, hvis du bare skal tælle alle brugere der er markeret aktive, da denne kræver en del RAM.

COUNT(*)

Der en anden måde at finde ud af hvor mange forekomster der er i "bruger" tabellen, det er nemlig med funktionen "COUNT(*)".

SELECT COUNT(*) AS c
FROM bruger
WHERE brugeraktiv = 'Ja';

Hvis man bruger "$resbruger->num_rows", så vil denne kun returnere et 1-tal, da der kun er en række i resultatet.

Avanceret Brug Af COUNT(*)

Jeg sad og legede med noget SQL, for at optimere et forum. Jeg har en oversigts side hvor jeg viser de seneste emner som der er blevet tilføjet noget i.

Dette er resultatet.

SELECT ft.*, u.user_screenname, COUNT(fp.forum_topic_id) AS c
FROM forum_topic AS ft
	JOIN forum_post AS fp
	JOIN user AS u
WHERE fp.forum_topic_id = ft.forum_topic_id
	AND ft.forum_topic_latest_user = u.user_id
	AND fp.forum_post_date_remove IS NULL
GROUP BY fp.forum_topic_id
ORDER BY ft.forum_topic_latest_date DESC
LIMIT 10;

Dette kald returnerer de seneste 10 forekomster i "forum_topic", det er det der er meningen, man kan rent faktisk sige at resultatet er at hver række er et emne, med brugernavnet på den der har lavet det seneste indlæg og så tæller vi lige antallet af indlæg i det pågældende emne.

Det hele er lidt kringlet at finde ud af, men det lykkedes mig ved hjælp af "JOIN", "COUNT(*)" og "GROUP BY".

Funktionen "COUNT(*)" tæller jo alle forekomster, men man kan, ved lidt snilde, bruge "GROUP BY", der rent teknisk grupperer resultater efter et kriterie, eller flere kriterier.

"ORDER BY" samt "LIMIT" vil jeg beskrive en senere artikel.