Avatar billede macolsen Nybegynder
07. november 2004 - 16:00 Der 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&aring;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')

På forhånd tak

/K
Avatar billede erikjacobsen Ekspert
07. november 2004 - 16:11 #1
"SELECT unavn, COUNT(*) AS antal FROM dvd WHERE unavn<>''GROUP BY unavn"
Avatar billede macolsen Nybegynder
07. november 2004 - 16:17 #2
Det var jo lige til ;o)
Mange tak Erik.

Er det også muligt at hente ejerne frem, fra hvem de er udlånt af?
Avatar billede myplacedk Nybegynder
07. november 2004 - 16:27 #3
Ja, hvis der står i tabellen "dvd" hvem der ejer den.

Hvordan du gør, afhænger af hvad det helt præcist er, du vil have. Fx:

Låner - Film - Udlåner
Far - The Matrix - Jonas
Flemming - Kill Bill - Jonas
Flemming - Spiderman - Marianne

Men én ting er i hvert fald vigtigt:
Hvordan identificerer du den enkelte film i de to tabeller?
Avatar billede macolsen Nybegynder
07. november 2004 - 16:43 #4
Ja, der står hvem der ejer den.

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å.
Avatar billede erikjacobsen Ekspert
07. november 2004 - 18:27 #5
Så har du ikke en tabel, der hedder ejer, men et felt. Du må hellere lære de rigtige ord ;)

Hvad med

  select unavn,titel,ejer from dvd where unavn<>'' order by unavn
Avatar billede myplacedk Nybegynder
07. november 2004 - 18:46 #6
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
Avatar billede macolsen Nybegynder
07. november 2004 - 19:04 #7
Mange tak, begge to.

Erik, lægger du et svar. Så deler i point.
Avatar billede erikjacobsen Ekspert
07. november 2004 - 19:19 #8
Nej tak ;) Jeg samler slet ikke på point.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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