Avatar billede para7 Nybegynder
04. marts 2011 - 10:11 Der er 27 kommentarer og
1 løsning

Tælle antal forekomster i MYSQL tabel

Her er en forsimplet grundkode. Jeg vil gerne tælle hvor mange der er af hver lejlighed der er bookede. Jeg skal bruge en form for variabel værdi for hver lejlighed, der kan være op mod hundrede forskellige. Jeg skal så bruge de værdier til at sammenligne noget andet bagefter. Nogen der har en ide?

<?php
include("../dbconn.php");
if (! $link)
die(mysql_error());
mysql_select_db($db , $link)
or die("Couldn't open $db: ".mysql_error());
$sql = "SELECT * FROM booked ";
$result = mysql_query($sql)
or die("SELECT Error: ".mysql_error());
if ($row = mysql_fetch_array($result)) {
    do {

        $counter = $counter +1;

        echo $counter." - ".$row["id"]." - ".$row["case_id_b"]."<br>";

    } while($row = mysql_fetch_array($result));

}
mysql_close($link);
?>

Ovenstående kode giver følgende output, som stemmer med tabellen set med HeidiSQL. Dog ved jeg ikke hvorfor tælleren starter med 5:

5 - 1 - fg-d-16
6 - 2 - fg-d-16
7 - 3 - fg-d-16
8 - 4 - fg-a-09
9 - 5 - fg-a-09
Avatar billede danco Nybegynder
04. marts 2011 - 10:21 #1
Kan du ikke bruge mysql COUNT() funktionen ?
04. marts 2011 - 10:23 #2
Det maa du nok forklare naermere. 

Du har et antal lejligheds-typer (der han vaere op mod hundrede forskellige typer) og du vil vide hvor mange af hver lejligheds-type der er booked.  Er det problemstillingen?

Hvis denne problemstilling er rigtigt forstaaet, saa der to spoergsmaal:  (1)  Hvordan kender du typen paa en lejlighed, og (2) hvordan ved du om en individuel lejlighed er booked?  Staar det i felter i tabellen Booked?
Avatar billede para7 Nybegynder
04. marts 2011 - 11:55 #3
Tak, godt at nogen vil hjælpe, jeg uddyber lige:
Bookingsystemet er en mere kompliceret historie, som volder mig hovedbrud og jeg har delt det op og forenklet. sætter så sammen bagefter. Min plan er i første omgang, sagt på en anden måde:
Lad os simpelthen finde en metode til at tælle hvor mange emner (fg-d-16 eller fx fg-a-09) der går igen i booked tabellen. De oplysninger skal så gemmes fx i en session for hver.
Avatar billede para7 Nybegynder
04. marts 2011 - 12:02 #4
danko:
Ja, count lyder vist som noget.

Christian_Belgien:
(1) Typen er sat ind i tabellen booked manuelt som case_id_b
(2) Tabellen booked er de perioder lejlighederne er udlejet
Avatar billede para7 Nybegynder
04. marts 2011 - 12:04 #5
Som det ses går fx fg-d-16 igen 3 gange, og så skal det tælles og gemmes.
Avatar billede para7 Nybegynder
04. marts 2011 - 12:07 #6
Altså på samme side længere nede koderne skal jeg sammenholde de fundne antal med nye fundne antal. Hvis det lykkes, så er hele missionen løst. Delmissionen er denne opgave.
04. marts 2011 - 12:14 #7
Saa i stedet for at taelle hvor mange linier der er i tabellen 'booked' per lejlighedstype der har bookingstatus = 'booked' forenkler vi maalsaetningen til at taelle hvor mange linier der er for hvert bogstav 'a', 'b', .. hvor vaerdien af et andet felt er 'fg'.

Men saa maa jeg antage at det felt i tabellen hvor 'fg' staar hedder 'booked' og det felt hvor a, b,.. staar hedder 'type'.  Saa maa loesningen vel vaere i retning af

$antal = mysql_query("SELECT type, COUNT(*) FROM booked WHERE booked = 'fg' GROUP BY type");
Avatar billede para7 Nybegynder
04. marts 2011 - 13:53 #8
OK, men fg står for Flower Garden og så tæller man de lejligheder der ligger der. Der er omkring 100 lejligheder til leje. Det må kunne lade sig gøre at gemme en variabel/session for hver af dem, evt. bare en liste, der viser hvor mange gange den går igen i tabellen. fx:

$lejlighed_liste indeholder så fx:
fg-d-16_3,fg-a-09_2,osv...

Så kan jeg sammenkøre den liste senere i koden.
04. marts 2011 - 14:33 #9
para7, jeg stod og skulle ud af doeren og konen rykkede allerede i mig da jeg skoed min sidste mail af.  Jeg nu tilbage, og jeg kikker ovenstaaende igennem i ro og mag og kommer tilbage.
Avatar billede para7 Nybegynder
04. marts 2011 - 15:29 #10
Det lyder rigtig godt, så kan den gordiske knude løses.
04. marts 2011 - 16:31 #11
Saa den forstaaelse af problemet jeg gav udtryk for i #7 var forkert.  Her er min nye forstaaelse:

Du har en tabel 'booked' der viser hvilke lejligheder der er booked i hvilke perioder.  'booked' indeholder et felt 'case_id_b' der indeholder identiteten af lejlighederne, og formodenlig indeholder 'booked' en raekke andre felter der angiver bookingsperioder og lignende, men for dette spoergsmaal er perioder og lignende ligegyldigt, det drejer sig udelukkende om at faa fat paa antal gange hver lejlighed forekommer i 'booked'.  Hvis en lejlighed ikke er booked og derfor ikke forekommer i 'booked' kommer der ingen oplysninger derover. 

Har jeg forstaaet det rigtigt?  I saa fald er forespoergslen simpelthen "SELECT case_id_b AS lejlighed FROM booked" .  Hvis du ikke nu vil fortaelle hvad resultatet skal bruges til placerer jeg det i en assosiativ array med key=>value = lejlighed=>antal.  Jeg printer saa arrayen ud, men du kan genbruge den i din videre kode.

For at teste den foelgende kode lavede jeg en test-tabel para_7 med nedenstaaende indhold og en mini-hjemmeside du kan kikke paa i http://christianjorgensen.be/para_7.php .

Her er min foreslaaede kode:

<?
$link = mysql_connect ('xxxx', 'yyyy', 'zzzz') or die(mysql_error());
mysql_select_db('qqqq') or die('Could not select database');
 
mysql_close($link); 
?>
$counting = mysql_query("SELECT case_id_b AS lejlighed, COUNT(*) AS antal FROM para_7 GROUP BY case_id_b ORDER BY case_id_b")or die(mysql_error());
while($row = mysql_fetch_array($counting))
{
  $array[$row['lejlighed']] = $row['antal'];
  //$array[] = $row['antal'];
}

print_r($array);
?>

Resultatet er dette:

Array ( [fg-d-11] => 3 [fg-d-12] => 1 [fg-d-13] => 4 )

hvilket er korrekt efter den tabel jeg bruger:

CREATE TABLE para_7(case_id_b VARCHAR(10));

INSERT INTO para_7 VALUES('fg-d-11');
INSERT INTO para_7 VALUES('fg-d-11');
INSERT INTO para_7 VALUES('fg-d-11');
INSERT INTO para_7 VALUES('fg-d-12');
INSERT INTO para_7 VALUES('fg-d-13');
INSERT INTO para_7 VALUES('fg-d-13');
INSERT INTO para_7 VALUES('fg-d-13');
INSERT INTO para_7 VALUES('fg-d-13');
Avatar billede para7 Nybegynder
05. marts 2011 - 10:02 #12
Tak, det må jeg se på e eftermiddag.
07. marts 2011 - 10:47 #13
para7, du kom ikke tilbage.  Betyder det at problemet er loest? (Jeg opretter dettte som svar ifald du finder at jeg har hjulpet.)  Eller har du flere problemer/spoergsmaal?  I saafald fortael.
Avatar billede para7 Nybegynder
07. marts 2011 - 11:00 #14
Hej Christian
Jeg har ikke endnu kunnet forstå forslaget. Jeg vil jo egentlig bare have talt op hvor mange der går igen af lejlighederne i bookingtabellen.
Avatar billede para7 Nybegynder
07. marts 2011 - 11:08 #15
Ellers super tak for udspillet. Det ser rigtigt ud. Men hvorfor tæller du fra en tabel ved navn para_7 og ikke booked? "COUNT(*) AS antal FROM para_7"
Avatar billede para7 Nybegynder
07. marts 2011 - 11:10 #16
PS: Mit system kører sådan at alle der vil være udlejere skal oprettes i booked tabellen men til at starte med bare med en nulværdi for booked udlejningsperiode.
Avatar billede para7 Nybegynder
07. marts 2011 - 11:11 #17
Du får selvfølgelig alle point når jeg lige har fået det til at virke. vender tilbage senere i dag, har noget at ordne.
07. marts 2011 - 12:41 #18
Tabel para_7 - det er fordi jeg plejer at teste mine loesningsforslag foer jeg posterer dem hvilket indebaerer at oprette tabeller i min mysql installation og for at kunne finde ud af det laver jeg som regel tabelnavne der minder om spoergerens navn.  Jeg skulle have sagt at du naturligvis skal bruge dine egne tabelnavne.
Avatar billede para7 Nybegynder
07. marts 2011 - 14:41 #19
Forståeligt, så skal jeg bare udskifte para_7 med booked.
Avatar billede para7 Nybegynder
07. marts 2011 - 15:26 #20
Din kodeopstilling gir' altså fejl som den er. Jeg vil gerne be' om at vi fortsætter med min kodeopstilling som udgangspunkt, ellers bedes du lige lave en kode der kan integreres ud fra min oprindelige kode. Jeg er ikke nogen haj til PHP endnu.
Kan vi ikke arbejde ud fra det her, som dog giver fejl endnu?

<?php
include("../dbconn.php");
if (! $link)
die(mysql_error());
mysql_select_db($db , $link)
or die("Couldn't open $db: ".mysql_error());
$sqlCounting = "SELECT case_id_b AS lejlighed, COUNT(*) AS antal FROM booked GROUP BY case_id_b ORDER BY case_id_b";
$result = mysql_query($sqlCounting)
or die("SELECT Error: ".mysql_error());
if ($row = mysql_fetch_array($result)) {
    while($row = mysql_fetch_array($counting))
    {
      $array[$row['lejlighed']] = $row['antal'];
      //$array[] = $row['antal'];
    }

print_r($array);

}
mysql_close($link);

?>
Avatar billede para7 Nybegynder
07. marts 2011 - 15:34 #21
PS: Min kodeopstilling skulle være rimelig efter bogen. Her er forenklet indhold af dbconn.php:

$db="udlejedatabase";
$link = mysql_connect('localhost', 'root', '');
Avatar billede para7 Nybegynder
07. marts 2011 - 15:41 #22
Lige en opdatering af min foreslåede kode. Giver fejlen:
"...mysql_fetch_array(): supplied argument is not a valid MySQL result ..."

<?php
include("../dbconn.php");
if (! $link)
die(mysql_error());
mysql_select_db($db , $link)
or die("Couldn't open $db: ".mysql_error());
$sqlCounting = "SELECT case_id_b AS lejlighed, COUNT(*) AS antal FROM booked GROUP BY case_id_b ORDER BY case_id_b";
    while($row = mysql_fetch_array($sqlCounting))
    {
      $array[$row['lejlighed']] = $row['antal'];
    }

print_r($array);
mysql_close($link);
?>
07. marts 2011 - 17:43 #23
For at du ved det saa er jeg nu ved at udarbejde et indlaeg, men det kommer nok til at tage en times tid foer jeg faar det faerdigt.
07. marts 2011 - 18:40 #24
Altsaa:

Koderne du viser i #20 og #22 virker ikke.  Det har du konstateret, og det er der adskillige grunde til.  Vil du vaere med til at analysere det?  I saa fald bliver vi noedt til at tage det trin for trin.  Jeg kan kun give hjaelp til selvhjaelp.  Hvis du synes det bliver for meget besvaer, saa er jeg bange for at jeg ikke kan hjaelpe.

Koden goer tre ting som hver for sig kan gaa galt:

(1) Koden opretter en forbindelse til databasen og lukker forbindelsen igen.  Det er de foerste fem linier og den sidste af koden i #20.

(2) Koden henter saa data fra databasen.  Det er linierne der starter med $sqlCounting og $result.

(3) Og endelig presenterer koden resultatet.  Det er koden fra "if($row-.." og ned til "print_r($array;)"

Lad os kikke paa (3) foerst.  I #20 giver det fejl fordi du i mysql_fetch_array referer til $counting som ikke er defineret i koden, og i #22 giver det fejl af to aarsager

(a)  du har sprunget selve forespoergslen over, altsaa linien $result-mysql_query($sqlCounting)

(b)  din mysql_fetch_array() referer til $sqlCounting som bare er en almindelig tekststreng, ikke et resultat fra en forespoergsel.  Resultatet af forespoergslen er i $result, saa du skal bruge mysql_fetch_array($result).

altsaa:

<?php
include("../dbconn.php");
if (! $link)
die(mysql_error());
mysql_select_db($db , $link)
or die("Couldn't open $db: ".mysql_error());

$sqlCounting = "SELECT case_id_b AS lejlighed, COUNT(*) AS antal FROM booked GROUP BY case_id_b ORDER BY case_id_b";
$result = mysql_query($sqlCounting) or die("SELECT Error: ".mysql_error());
while($row = mysql_fetch_array($result))
{
    $array[$row['lejlighed']] = $row['antal'];
}

mysql_close($link);
?>

Hvis du retter det til (og lad nu vaere med 'copy and paste' men skriv koden ind med haanden og vaer sikker paa at du forstaar hver linie) saa skulle du med lidt held faa et korrekt resultat printet ud!  Og saa kan du springe resten over.

Hvis ikke, saa maa vi gaa baglaens til (2) og kikke paa koden der forespoerger databasen.  Hvis du ikke faar nogen fejlmelding med "SELECT Error..." eller "There is an error in your query. Consult your manual...." saa skulle selve syntaksen af forespoergslen vaere i orden.  Men det kan vaere at tabellen ikke indeholder nogen vaerdier der svarer til din query.  Det kan du undersoege ved at taelle antallet af svar der kommer ud af forespoergslen med funktionen mysql_num_rows().  Proev denne kode af:

<?php
include("../dbconn.php");
if (! $link)
die(mysql_error());
mysql_select_db($db , $link)
or die("Couldn't open $db: ".mysql_error());
$sqlCounting = "SELECT case_id_b AS lejlighed, COUNT(*) AS antal FROM booked GROUP BY case_id_b ORDER BY case_id_b";
$result = mysql_query($sqlCounting)
or die("SELECT Error: ".mysql_error());
$number = mysql_num_rows($result);
echo "NUMBER = $number";
?>

Saa skulle du faa skrevet ud "NUMBER = " og et tal.  Hvis tallet er 0 saa indeholder tabellen ingen vaerdier der svarer til din forespoergsel.  Saa skal du nok checke tabellen og dens navne af.

Hvis du slet ikke faar noget udskrevet, saa maa vi tilbage til (1), koden der forbinder til databasen der fejler.  Har du korrekte server- bruger- database navne?
Avatar billede DonTorro Nybegynder
07. marts 2011 - 18:42 #25
min db:
id - case_id_b

resultat -> Array ( [lej1] => 3 [lej2] => 1 )

<?php
include("database.php");

$sqlCounting = "SELECT case_id_b AS lejlighed, COUNT(*) AS antal FROM booked GROUP BY case_id_b ORDER BY case_id_b";
$result = mysql_query($sqlCounting) or die(mysql_error());
    while($row = mysql_fetch_array($result))
    {
      $array[$row['lejlighed']] = $row['antal'];
    }

print_r($array);
mysql_close($link);
?>
07. marts 2011 - 19:07 #26
DonTorro, vores indlaeg krydsede nok hinanden, men vi synes at vaere enige.
Avatar billede DonTorro Nybegynder
07. marts 2011 - 19:08 #27
ja :)
Avatar billede para7 Nybegynder
08. marts 2011 - 10:12 #28
Tak for det store arbejde, det virker. Nu har jeg styr på hvor mange bookings der er lavet for hver lejlighed.
So far so good. Så er opgaven hvordan jeg får skjult en lejlighed, som er booked. Jeg åbner et nyt spm, når jeg har arbejdet mig frem til en foreløbig kode. (Jeg har ellers stort set klaret alle opgaver stillet, men det her har pippet mig ud, kommer fra ASP). Tak for nu :)
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