Avatar billede iziqio Nybegynder
05. februar 2006 - 17:01 Der er 13 kommentarer og
1 løsning

Tælle i mySql.

Jeg har en tabel der ser cca således ud:

Navn - farve1 - farve2 - farve3
-------------------------------
fisk1 - blå - blå - grøn
fisk2 - blå - grøn - blå
fisk3 - blå - grøn - blå
-------------------------------

Nu vil jeg gerne opstille et svar der viser, hvor mange fik der har farven blå som farve nr 1 og blå som nr 2 og blå som nr 3.

Hvordan gør jeg det?
(Jeg håber at jeg har forklaret min tabel struktur godt nok)
Avatar billede iziqio Nybegynder
05. februar 2006 - 17:03 #1
Altså det er ikke en forudsætning af alle farverne på fisken er blå.

Resultatet skal være.
Farve1 = 3 blå
farve2 = 1 blå
farve3 = 2 blå
Avatar billede iziqio Nybegynder
05. februar 2006 - 17:17 #2
og så skal svarene sorteres efter antal blå :S og alle uden blå skal ikke på listen.
Avatar billede stieper Nybegynder
05. februar 2006 - 17:18 #3
$tael_farve1 = mysql_query("SELECT COUNT(*) AS antal FROM tabel WHERE farve1 = blå") or die (mysql_error());
$antal_farve1 = mysql_result($tael_farve1,0);

echo "Der findes $antal_farve1 som har blå som farve1";


Og så videre for de andre to farver.. sikkert en nemmere måde, men d var et forslag ;-)
Avatar billede iziqio Nybegynder
05. februar 2006 - 17:22 #4
Så får jeg kun en række :(
Jeg skal kunne sortere alle "antallene".
Avatar billede stieper Nybegynder
05. februar 2006 - 17:34 #5
$tael_farve1 = mysql_query("SELECT COUNT(*) AS antal FROM tabel WHERE farve1 = blå") or die (mysql_error());
$antal_farve1 = mysql_result($tael_farve1,0);

$tael_farve2 = mysql_query("SELECT COUNT(*) AS antal FROM tabel WHERE farve2 = blå") or die (mysql_error());
$antal_farve2 = mysql_result($tael_farve2,0);

$tael_farve3 = mysql_query("SELECT COUNT(*) AS antal FROM tabel WHERE farve3 = blå") or die (mysql_error());
$antal_farve3 = mysql_result($tael_farve3,0);

Så kan du køre dem igennem noge "if" checks, for at sortere dem efter størrelse, og udskrive dem i en tabel ;-)
Avatar billede iziqio Nybegynder
05. februar 2006 - 17:35 #6
Det går vist ikke hvis jeg har fisk med 20 farver :(
Avatar billede iziqio Nybegynder
05. februar 2006 - 17:36 #7
eller måske, jeg prøver lige noget
Avatar billede iziqio Nybegynder
05. februar 2006 - 17:36 #8
aj det burde man altså kunne gøre i SQL.
Avatar billede stieper Nybegynder
05. februar 2006 - 17:44 #9
Ok - kan man garanteret også - kan bare ikke lige greje den her og nu.. vender tilbage i morgen, hvis andre ikke har svaret ;-) Good luck.

Se evt på SORT funktionen i MySQL manualen - eller "sort" funktionen i php ;-)
Avatar billede iziqio Nybegynder
05. februar 2006 - 17:45 #10
lækkert, ja jeg sidder også og læser og læser :S
Avatar billede stieper Nybegynder
06. februar 2006 - 12:34 #11
Hmm.. kunne ikke lige finde løsningen i MySQL, men her er da en løsning som kan gøre hvad du kræver i php:
$sql_1 = "SELECT * FROM tabel WHERE farve1 = 'blå'";
$resultat_1 = mysql_query($sql_1) or die(mysql_error());
$number_1 = mysql_num_rows($resultat_1);

$sql_2 = "SELECT * FROM tabel WHERE farve2 = 'blå'";
$resultat_2 = mysql_query($sql_2) or die(mysql_error());
$number_2 = mysql_num_rows($resultat_2);

$sql_3 = "SELECT * FROM tabel WHERE farve3 = 'blå'";
$resultat_3 = mysql_query($sql_3) or die(mysql_error());
$number_3 = mysql_num_rows($resultat_3);

$farver = array("Farve1"=>$number_1, "Farve2"=>$number_2, "Farve3"=>$number_3);

arsort($farver);

while( $element = each($farver)) {
   
    echo "Der findes ";
    echo $element["value"];
    echo " som har ";
    echo $element["key"];
    echo " som blå. <br />";
   
}

og hvis du vil have dem sorteret i stigende rækkefølge i stedet, bruger du bare:

asort($farver);
Avatar billede muddi Praktikant
06. februar 2006 - 23:56 #12
izigio > Jeg vil anbefale dig at læse noget om normalisering af data. Det er MEGET "forkert" at kalde felter for farve1, farve2, farve3, farve4 ... etc.
For en eller anden dag står du med en fisk der har en farve mere end der er felter i din tabel(!) Hvad så?! Så er løsningen at opdatatere tabellen... men hvad så dagen efter, når der er en fisk med endnu én farve?

Desuden bør der ikke være flere felter i samme tabel der indeholder samme værdi. Derfor foreslår jeg at du omstrukturerer din database (inden det er for sent), og så opretter en mange-til-mange relation mellem tabellen `fisk` og tabellen `farver`.

tabel fisk:
fisk_id  fisk_navn
-------------------
1        Torsk
2        Ørred
3        Sildehaj

tabel farve:
farve_id farve_navn
--------------------
1        Grå
2        Grøn
3        Hvid


tabel fisk_farve
fisk_ffid  farve_ffid
-----------------------
1          1
1          2
2          2
3          3


Du har altså dine data delt op i to tabeller, og bruger en tredje tabel til at binde disse data sammen parvis.

Du har nemlig også et andet problem med din nuværende struktur, nemlig at du mister data om farver når du sletter data om fisk. Det undgår du ved at normalisere dine data.

Der findes mange gode tekster både i bøger og på internettet om normalisering af data (engelsk: normalization). Det er virkelig noget der er essentielt når man beskæftiger sig med databaser, fordi det kan spare en for en masse ekstra arbejde og letter arbejdet med at skrive forespørgsler til udtrækning af data.

Jeg vil ikke give noget bud på hvordan du løser dit konkrete problem, idet jeg faktisk mener at din tabelstruktur er dit egentlige problem ;)

Håber du kan bruge mit indlæg til noget...

Mvh. Morten
Avatar billede iziqio Nybegynder
07. februar 2006 - 22:06 #13
Tak for svaret stieper og kommentar morten. Jeg har løst det med en blanding SQL og løkker. Smid svar Stieper. (Morten, jeg kan ikke opbygge den stuktur pga varierende tabal struktur)
Avatar billede stieper Nybegynder
08. februar 2006 - 08:29 #14
Hermed svar. ;-)

Må man se din kode, af nysgerrige grunde?? ;-)
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
Computerworld tilbyder specialiserede kurser i database-management

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