07. november 2004 - 16:00Der er
7 kommentarer og 1 løsning
Tælle antal i DB
Hej Eksperter,
Jeg har flg. kode:
<? $db = mysql_connect("localhost", "XXXX", "XXXX"); mysql_select_db("XXXX_db", $db); $res = mysql_query("SELECT unavn, COUNT(*) AS antal FROM dvd GROUP BY unavn") or die (mysql_error()); while ($row = mysql_fetch_assoc($res)) { echo $row['unavn'] . " har lånt: " . $row['antal'] . " film<br/>"; } ?>
Vi er 3 der indtaster vores DVD film i min database. Både for at holde styr på hvor mange vi har, og hvem/hvormange der er udlånt.
Mit problem: 1) Jeg vil kun ha' den til at tælle, der hvor der står noget i tabellen (unavn). Som det er nu, skriver den:
har lånt: 153 film Far har lånt: 1 film Flemming har lånt: 2 film Jonas har lånt: 2 film Marianne har lånt: 1 film
Det er for så vidt også rigtigt, men den skal ikke skrive den 1. linie ( har lånt 153 film) Det er jo alle filmene i DB'en
2) Hvad gør jeg, hvis jeg også vil have den til at skrive, hvem de har lånt filmen af? (Den tabel hedder 'ejer')
CREATE TABLE dvd ( id int(11) NOT NULL auto_increment, titel tinytext NOT NULL, udgivelse tinytext NOT NULL, ukryds tinytext NOT NULL, unavn tinytext NOT NULL, udato tinytext NOT NULL, pict tinytext NOT NULL, region tinytext NOT NULL, ejer tinytext NOT NULL, dd tinytext NOT NULL, dts tinytext NOT NULL, extend tinytext NOT NULL, adisc tinytext NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM;
Dit eks. med (låner - film - udlåner) var faktisk det jeg havde tænkt på.
Det er jo egentlig MySQL-spørgsmål, det har intet med PHP at gøre. Men lad gå for denne gang. ;-)
Du skriver ikke hvordan denne tabel hænger sammen med tabellen "ejer", så jeg gætter mig frem: Jeg gætter på at feltet "ejer" er id'en på ejeren i tabellen "ejer":
SELECT unavn, COUNT(*) AS antal, ejer.navn FROM dvd LEFT JOIN ejer ON dvd.ejer = ejer.id WHERE unavn IS NOT NULL GROUP BY unavn
OBS: I denne query går jeg ud fra, at unavn-feltet er null, hvis filmen ikke er udlånt. Sådan foregår det ikke i praksis, da feltet er "NOT NULL", og dermed ikke kan være null. Du bruger åbenbart en tom streng i stedet. Det virker nok fint her og nu, men er ikke den anbefalede "rigtige" måde at gøre det på. Eksempler på hvorfor det er smart: - COUNT(unavn) fortæller dig hvor mange film der er udlånt. (Hvor mange film, der har unavn defineret) - COUNT(DISTINCT unavn) fortæller dig hvor mange mennesker, der har lånt film. (Hvor mange forskellige værdier der er i unavn) Det virker dog kun, hvis du har gjort som jeg (man) anbefaler. Som du gør det nu, vil den første tælle alle film med, og den anden vil tælle "ingen" med, dvs. viser én for meget.
Da feltet "ejer" er en tekst og ikke et tal, er det jo også muligt, at navnet står direkte der, på trods af hvad du sagde. I så fald er det noget simplere, du skal blot tilføje "ejer" i listen over hvilke felter, du vil have med:
SELECT unavn, COUNT(*) AS antal, ejer FROM dvd WHERE unavn IS NOT NULL GROUP BY unavn
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.