/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Tælle i udtræk fra MySQL
Fra : Kim Ludvigsen


Dato : 24-09-06 15:32

Jeg skal lave et opslag i en MySQL-database for at tælle, hvor mange
forekomster der er af hver værdi i de enkelte felter.

Jeg har 28 felter med 5 mulige værdier i hver, og jeg skal have lavet en
liste i stil med dette:

Felt 1
værdi 1: 5 forekomster
værdi 2: 1 forekomst
værdi 3: 3 forekomster
værdi 4: 2 forekomster
værdi 5: 1 forekomst

Felt 2
Værdi 1: 1 forekomst
osv.

Jeg går ud fra, at det er nemmest/bedst at hente samtlige oplysninger ud
af databasen på én gang og så lade php finde tallene i stedet for at
foretage 28 opslag i databasen. Men hvordan gør jeg?

Jeg er på helt bar bund, og har kun et meget overfladisk begreb om php
og MySQL, så pædagogisk hjælp eller henvisning til en pædagogisk
hjemmeside påskønnes.

--
Mvh. Kim Ludvigsen
Instant Converter lader dig omregne forskellige måleenheder, for
eksempel miles og kilometre, ounce og gram samt fahrenheit og celcius.
http://kimludvigsen.dk

 
 
Martin (24-09-2006)
Kommentar
Fra : Martin


Dato : 24-09-06 15:42

Kim Ludvigsen wrote:
> Jeg skal lave et opslag i en MySQL-database for at tælle, hvor mange
> forekomster der er af hver værdi i de enkelte felter.
>
> Jeg har 28 felter med 5 mulige værdier i hver, og jeg skal have lavet en
> liste i stil med dette:
>
> Felt 1
> værdi 1: 5 forekomster
> værdi 2: 1 forekomst
> værdi 3: 3 forekomster
> værdi 4: 2 forekomster
> værdi 5: 1 forekomst
>
> Felt 2
> Værdi 1: 1 forekomst
> osv.
>
> Jeg går ud fra, at det er nemmest/bedst at hente samtlige oplysninger ud
> af databasen på én gang og så lade php finde tallene i stedet for at
> foretage 28 opslag i databasen. Men hvordan gør jeg?
>
> Jeg er på helt bar bund, og har kun et meget overfladisk begreb om php
> og MySQL, så pædagogisk hjælp eller henvisning til en pædagogisk
> hjemmeside påskønnes.
>

Du kan lave det lidt ala

$array = array(
array(
felt=>1
,værdi=>5
,antal=>5
)
, array(
felt=>1
,værdi=>5
,antal=>1
)
// osv.
);

Kim Ludvigsen (24-09-2006)
Kommentar
Fra : Kim Ludvigsen


Dato : 24-09-06 16:09

Den 24-09-06 16.41 skrev Martin følgende:

> Du kan lave det lidt ala
>
> $array = array(

Jeg er desværre på så bar bund, at jeg ikke aner, hvordan jeg gør det.

Jeg er ikke kommet længere end til (jeg har også et datofelt med timestamp):
$query = 'SELECT * FROM database where dato is not null';
$result = mysql_query($query);

Og jeg er ikke engang sikker på, at det er den rigtige måde at hente det
ud fra databasen på.

--
Mvh. Kim Ludvigsen
Ryd op i dine højrekliksmenuer med Mmm Free.
http://kimludvigsen.dk

Michael Zedeler (24-09-2006)
Kommentar
Fra : Michael Zedeler


Dato : 24-09-06 18:08

Kim Ludvigsen wrote:
> Jeg skal lave et opslag i en MySQL-database for at tælle, hvor mange
> forekomster der er af hver værdi i de enkelte felter.
>
> Jeg har 28 felter med 5 mulige værdier i hver, og jeg skal have lavet en
> liste i stil med dette:
>
> Felt 1
> værdi 1: 5 forekomster
> værdi 2: 1 forekomst
> værdi 3: 3 forekomster
> værdi 4: 2 forekomster
> værdi 5: 1 forekomst
>
> Felt 2
> Værdi 1: 1 forekomst
> osv.
>
> Jeg går ud fra, at det er nemmest/bedst at hente samtlige oplysninger ud
> af databasen på én gang og så lade php finde tallene i stedet for at
> foretage 28 opslag i databasen. Men hvordan gør jeg?

Det kommer meget an på hvilken version af mysql, du har til rådighed.
Hvis du har version 5.x, kan det meste ordnes med en enkelt forespørgsel
- uden at skulle lave efterbehandling i PHP.

Ellers er det muligvis bare at hente hele tabellen ud og køre den
igennem et PHP-script, som tæller forekomster.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Kim Ludvigsen (24-09-2006)
Kommentar
Fra : Kim Ludvigsen


Dato : 24-09-06 18:29

Den 24-09-06 19.08 skrev Michael Zedeler følgende:

> Det kommer meget an på hvilken version af mysql, du har til rådighed.
> Hvis du har version 5.x, kan det meste ordnes med en enkelt forespørgsel
> - uden at skulle lave efterbehandling i PHP.

Det lyder fint, det er version 5.0.24.

--
Mvh. Kim Ludvigsen
Judas: Udtryk for en homoseksuel mand...
http://ordforklaring.dk/ordforklaring.php?forklaring=judas

Michael Zedeler (24-09-2006)
Kommentar
Fra : Michael Zedeler


Dato : 24-09-06 19:31

Kim Ludvigsen wrote:
> Den 24-09-06 19.08 skrev Michael Zedeler følgende:
>
>> Det kommer meget an på hvilken version af mysql, du har til rådighed.
>> Hvis du har version 5.x, kan det meste ordnes med en enkelt
>> forespørgsel - uden at skulle lave efterbehandling i PHP.
>
> Det lyder fint, det er version 5.0.24.

Sådan en har jeg ikke, så dette her er ikke checket imod en rigtig database:

SELECT COUNT(*), 'felt1' FROM (SELECT DISTINCT felt1 FROM mintabel)
UNION
SELECT COUNT(*), 'felt2' FROM (SELECT DISTINCT felt2 FROM mintabel)
....

Jeg er ikke sikker på at det vil virke, men prøv det en gang. Hvis der
er problemer, så prøv

SELECT COUNT(*), 'felt1' FROM (SELECT DISTINCT felt1 FROM mintabel)

og se om det virker.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Kim Ludvigsen (24-09-2006)
Kommentar
Fra : Kim Ludvigsen


Dato : 24-09-06 20:21

Den 24-09-06 20.31 skrev Michael Zedeler følgende:

> Jeg er ikke sikker på at det vil virke, men prøv det en gang. Hvis der
> er problemer, så prøv
>
> SELECT COUNT(*), 'felt1' FROM (SELECT DISTINCT felt1 FROM mintabel)

Jeg får en Error 1248 (42000): Every derived table must have it's own alias.

--
Mvh. Kim Ludvigsen
Rustvogn: En bil, der er godt angrebet af rust i såvel undervogn som i
de bærende dele af karosseriet...
http://ordforklaring.dk/ordforklaring.php?forklaring=rustvogn

Michael Zedeler (24-09-2006)
Kommentar
Fra : Michael Zedeler


Dato : 24-09-06 21:55

Kim Ludvigsen wrote:
> Den 24-09-06 20.31 skrev Michael Zedeler følgende:
>
>> Jeg er ikke sikker på at det vil virke, men prøv det en gang. Hvis der
>> er problemer, så prøv
>>
>> SELECT COUNT(*), 'felt1' FROM (SELECT DISTINCT felt1 FROM mintabel)
>
> Jeg får en Error 1248 (42000): Every derived table must have it's own
> alias.

Hmmmn. Ja. Sådan løste jeg det:

http://www.google.dk/search?q=Every+derived+table+must+have+it%27s+own+alias

Klikker første link og genfinder fejlbeskeden længere nede med en
beskrivelse af hvordan man løser den.

Det bliver til

SELECT COUNT(*), 'felt1' FROM (
   SELECT DISTINCT felt1 FROM mintabel) AS feltresultat1

Google er din ven.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Peter Brodersen (25-09-2006)
Kommentar
Fra : Peter Brodersen


Dato : 25-09-06 00:29

On Sun, 24 Sep 2006 22:55:08 +0200, Michael Zedeler
<michael@zedeler.dk> wrote:

>SELECT COUNT(*), 'felt1' FROM (
>   SELECT DISTINCT felt1 FROM mintabel) AS feltresultat1
>
>Google er din ven.

Hvis der ikke forekommer NULL-værdier, så kan man evt. klare sig med
følgende:

SELECT COUNT(DISTINCT felt1), 'felt1' FROM mintabel


COUNT(felt) tæller ikke felter med værdien NULL med, mens COUNT(*)
tæller enhver række med.

--
- Peter Brodersen
Hvis ens primære argumentationsform er "Definér (udsagn)!", så
bør man overveje, om man reelt bidrager med noget til nettet

Kim Ludvigsen (25-09-2006)
Kommentar
Fra : Kim Ludvigsen


Dato : 25-09-06 12:37

Den 24-09-06 22.55 skrev Michael Zedeler følgende:

> SELECT COUNT(*), 'felt1' FROM (
> SELECT DISTINCT felt1 FROM mintabel) AS feltresultat1

Jeg er så meget begynder, at jeg ikke forstår, hvordan jeg skal bruge
ovenstående. Jeg må nok strække våben og simpelthen bruge det, jeg kan
finde ud af, 140 forespørgsler i stil med:

$query = "SELECT a FROM tabel where a ='værdi1'";
$result = mysql_query($query);
$a1 = mysql_num_rows($result);

$query = "SELECT a FROM tabel where a ='værdi2'";
$result = mysql_query($query);
$a2 = mysql_num_rows($result);

Osv. Heldigvis skal siden med udtrækket ikke bruges ret ofte.

> Google er din ven.

Kun hvis man forstår det, der står på siderne

Tak til dig og Peter for forsøget.

--
Mvh. Kim Ludvigsen
Spareribs: Buskplante, hvis frugter bruges som tilbehør til maden...
http://ordforklaring.dk/ordforklaring.php?forklaring=spareribs

Peter Brodersen (25-09-2006)
Kommentar
Fra : Peter Brodersen


Dato : 25-09-06 15:49

On Mon, 25 Sep 2006 13:36:57 +0200, Kim Ludvigsen
<usenet@kimludvigsen.dk> wrote:

>$query = "SELECT a FROM tabel where a ='værdi1'";
>$result = mysql_query($query);
>$a1 = mysql_num_rows($result);

For det første behøver du ikke at trække al dataen ud. Det kan fylde
godt op i hukommelsen, hvis du ikke frigiver resultatet bagefter.

$query = "SELECT COUNT(*) FROM tabel where a ='værdi1'";
$result = mysql_query($query);
$a1 = mysql_result($result,0);

>$query = "SELECT a FROM tabel where a ='værdi2'";
>$result = mysql_query($query);
>$a2 = mysql_num_rows($result);
>
>Osv. Heldigvis skal siden med udtrækket ikke bruges ret ofte.

I den opsætning virker det som om, du blot skal have lavet en ordinær
optælling.

$query = "SELECT COUNT(*) AS antal, a FROM tabel GROUP BY a";
$result = mysql_query($query);
while ($row = mysql_num_rows($result)) {
   print $row['a'].": ".$row['antal']."<br />\n";
}


Hvis du i øvrigt er i tvivl, så start med at teste den rene SQL via en
passende mysql-klient (fx PHPMyAdmin, kommandolinjeklienten, etc.).
Det er lettere at få overblikket på den måde. Når man både blander PHP
og MySQL til databehandling, skal man have tungen lige i munden.
--
- Peter Brodersen
Hvis ens primære argumentationsform er "Definér (udsagn)!", så
bør man overveje, om man reelt bidrager med noget til nettet

Kim Ludvigsen (25-09-2006)
Kommentar
Fra : Kim Ludvigsen


Dato : 25-09-06 17:50

Den 25-09-06 16.48 skrev Peter Brodersen følgende:
> On Mon, 25 Sep 2006 13:36:57 +0200, Kim Ludvigsen
> <usenet@kimludvigsen.dk> wrote:

> I den opsætning virker det som om, du blot skal have lavet en ordinær
> optælling.

Netop, og derfor ledte jeg også efter en nemmere metode end at lave 140
forespørgsler.

> $query = "SELECT COUNT(*) AS antal, a FROM tabel GROUP BY a";
> $result = mysql_query($query);
> while ($row = mysql_num_rows($result)) {
>    print $row['a'].": ".$row['antal']."<br />\n";
> }

Ser smart ud, og det virker i konsollen, men i php udskrives resultatet
ikke, og løkken køres uendeligt, så jeg blot får en masse linjer med et
: på hver.

--
Mvh. Kim Ludvigsen
Jetlag: Træthed skabt af ioniserede partikler i de højere luftlag...
http://ordforklaring.dk/ordforklaring.php?forklaring=jetlag

Kim Ludvigsen (25-09-2006)
Kommentar
Fra : Kim Ludvigsen


Dato : 25-09-06 18:36

Den 25-09-06 18.50 skrev Kim Ludvigsen følgende:

> Ser smart ud, og det virker i konsollen, men i php udskrives resultatet
> ikke, og løkken køres uendeligt, så jeg blot får en masse linjer med et
> : på hver.

Du skal ikke bruge mere tid på det, jeg har udskiftet mine egne
forespørgsler med:
$query = "SELECT COUNT(*) FROM tabel where a ='værdi1'";
og det virker helt fint.

Jeg takker for hjælpen.

--
Mvh. Kim Ludvigsen
Polterabend: Tysk udtryk for et spøgelse, der larmer om aftenen...
http://ordforklaring.dk/ordforklaring.php?forklaring=polterabend

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste