Avatar billede Slettet bruger
04. februar 2011 - 15:53 Der er 7 kommentarer og
1 løsning

Count forskellige ting fra en tabel

Jeg har et bruger system hvor hver user har på tidspunkter lavet nogle valg. Disse valg er gemt i denne tabel kaldet "valg".

"valg" er opbygger sådan her:
[id][user][123]


Jeg bruger følgende til at udtrække mine data med:

$result = mysql_query("SELECT user, 123, FROM valg GROUP BY dw_USER") or die(mysql_error());
while ($row = mysql_fetch_array($result)){

$user = $row['user'];

echo "$user <br>";
}


Det giver dette udtræk:

User1
User2
User3

Jeg vil gerne have lavet nogle count's som fortæller:
Hvor mange gange hver bruger har valgt "1"
Hvor mange gange de har valgt "2"
Hvor mange gange de har valgt "3"

I colonen 123 i min tabel står brugernes valg.

Vil gerne have valgende kommer ud så der er en binde streg imellem dem. (antal 1'er)-(antal 2'er)-(antal 3'er)

I sidste ende skal det ende ud med at min udtræk ser sådan ud:

User1 1-1-2
User2 1-3-0
user3 4-0-0

Er det muligt at gøre på en nem måde i den guery jeg har pt eller skal der laves nogle nye?
04. februar 2011 - 18:15 #1
Jeg ved ikke om jeg kan loese det, derfor ventede jeg lidt for at se om der var en anden der begyndte.  Men hvis jeg skal proeve skal jeg vaere sikker paa at forstaa spoergsmaalet.  To spoergsmaal:

a.  Din query indeholder "GROUP BY dw_USER".  Hvor kommer den fra?  Skulle det i dette eksempel have vaeret "GROUP BY user"?

b.  Hvordan ser raekkerne i tabellen 'valg' ud?  Hvis User1 vaelger 1, derefter vaelger User2 3, derefter vaelger User1 3, og derefter vaelger User1 1 igen, ser raekkerne saa saaledes ud:

id user 123
1  User1 1
2  User2 3
3  User1 3
4  User1 1 ?

Og skal udtraekket saa vises saaledes:

User1 2-0-1
User2 0-0-1 ?
04. februar 2011 - 18:37 #2
Og et tillaegsspoergsmaal:  Er der kun valg mellem 1, 2, og 3 og vil det forblive saaledes?
Avatar billede Slettet bruger
05. februar 2011 - 03:56 #3
Jeps der skal stå "user". Jeg prøvede et system først på min hovedside. Men droppede det og besluttede mig for at starte fra bunden og lave en test side. Og da jeg skrev det ind her havde jeg åbenbart hovedet i min "main" side. Så kom til at skrive forkert.

Du har helt ret i hvordan min valg ser ud, og hvordan mine udtræk ser ud.

Tillægsspørgsmålet er lidt træls. Som det er lige nu er det 1, 2 og 3 der er valgt.

Håber at kunne lege lidt med min test side og så lære lidt mere.
På et tidspunkt kommer der måske en mere kolonne ind i min valg.
Og så skal den kun lave tælle hvis "nye_kolonne = 1".

Men det må nok blive et tillæg spørgsmål.
Skal lige lære det fra lidt imens det er lidt simpelt.

Sorry det sene svar er lige kommet hjem fra arbejde.

Tak fordi du tager dig tid til at se på det :)
05. februar 2011 - 12:43 #4
For din orientering, jeg er i gang med at kikke paa det, men det er komplekst, saa i bedste fald vil det tage tid, og muligvis maa jeg give op.
05. februar 2011 - 14:11 #5
Jo, endnu et tillaegsspoergsmaal:  Du er ikke sikker paa at der altid kun vil vaere tre valg, men vil valgene altid vaere fortloebenden tal?  Nu er det 1, 2, eller 3, og maaske vil det engang i fremtiden vaere 1, 2, 3, 4, eller 5, men kan det vaere 1, 2, 3, 5, 22?  Eller kan det vaere Hans, Jens, eller Pusse?  Jeg spoerger af hensyn til at vide hvor de forskellige optaellinger skal vises.  Saa laenge det kun er tal og fortloebende, for eksempel fra 1 til 4, saa skal der vaere fire kolonner med optaellinger.  Jeg taenker paa en query som denne:

SELECT user, `123`, COUNT(*) from valg GROUP BY user, `123` ORDER BY user, `123`.  Hvis user3 har 3x1, 5x2, ingen 3, og 2x4 saa giver queryen tre resultater:

user3 1 3
user3 2 5
user3 4 2

Jeg kan ikke faa den til at taelle 0, altsaa lave en raekke user3 3 0.  Saa naar det skal skrives ud i php saa skal jeg der foerst skrives user1, derefter 3, derefter 5, og saa programmet opdage at det skal indfoere en vaerdi den ikke faar fra queryen nemlig 0, og derefter skal programmet gaa videre med queryen.  Det kan lade sig goere hvis vaerdierne har en raekkefoelge og ingen huller, saasom 1,2,3,4 men 1,2,3,5 vil vaere vanskeligere.  a,b,c,d kan ogsaa lade sig goere men a,b,d,h vanskeligere.
05. februar 2011 - 20:06 #6
Jeg vaelger at gaa ud fra at det er som jeg spoerger i #5, valgene er altid fortloebende tal skoent der kan vaere mere end tre valg. 

For test lavede jeg en tabel som jeg kalder ddd_valg3 saaledes:

      id  user  123 
      1 User1 1
      2 User1 1
      3 User1 1
      4 User1 3
      5 User2 2
      6 User2 3

Det kan godt vaere at der findes en smart mysql  jeg ikke kender (i saa fald maa vi haabe at et andet medlem laeser dette og goer os opmaerksomt paa det) men i min foreslaaede loesning henter jeg fra mysql de raa data og saa formatterer jeg dem i php.  Jeg goer brug af en multi-dimensionel array.  Hvis du ikke kender den foreslaar jeg at du googler den op og kikker paa den (for eksempel http://www.phpf1.com/tutorial/php-multidimensional-array.html ).

Nedenstaaende kode gav dette resultat som du kan se paa http://christianjorgensen.be/ddd_valg.php :

User1 - 3 - 0 - 1
User2 - 0 - 1 - 1

Og her foelger koden som jeg har forsynet med forhaabenlig forstaaelige kommentarer.

//jeg undersoeger foerst hvad det hoejeste valgnummer er og gemmer det i $number
$n = mysql_query("SELECT MAX(`123`) FROM ddd_valg3")or die(mysql_error());
$number = mysql_result($n, 0);

//saa henter jeg, for hver user og valg, antal valgte
$result = mysql_query("SELECT user, `123` as valgt, COUNT(*) as count FROM ddd_valg3 GROUP BY user, `123` ORDER BY user, `123`")or die(mysql_error());

//en hjaelpevariabel til at se hvornaar man kommer til en ny user
$username = "";

//saa henter jeg resultatet af queryen og gemmer det i en to-dimensional array
while($row = mysql_fetch_array($result))
{
  $user = $row['user'];
  $valgt = $row['valgt'];
  $count = $row['count'];

  //her laves den to-dimensionale array. 
  if($user != $username) $username = $user;
  $array[$username][$valgt] = $count;
}

//saa skriver jeg resultatet ud som du foreskrev.  Med $i foelger jeg med i om der for hvert
//tal er en count.  Hvis ikke, saa indsaetter jeg 0
foreach($array as $username => $valgt)
{
  $i = 1;
  echo $username;
  foreach($valgt as $valgnummer => $antal)
  {
    while($i <= $number && $i < $valgnummer)
    {
      echo " - 0";
      $i++;
    }
    echo " - $antal";
    $i++;
  }
  while($i <= $number)
  {
    echo " - $i";
    $i++;
  }
  echo "<br>";
}
Avatar billede Slettet bruger
06. februar 2011 - 12:54 #7
Dejligt og godt beskrevet.
En rigtigt god måde, selvom det ikke er mysql.
Beskrivelserne gør det super nemt at forstå og det har gjort det nemt at lære ud fra.

Jeg har leget lidt med det og tror jeg har forstået princippet i det.

Selvom det ikke er noget jeg skal bruge lige pt, har jeg tænkt mig at undersøge lidt mere omkring hvad man kan gøre tilsvarende, hvis det nu ikke var tal. Men det har jeg lavet i et andet spørgsmål.

Rigtigt mange tak.
Avatar billede Slettet bruger
06. februar 2011 - 13:13 #8
Er forresten ked af jeg ikke fik svaret på dit tillægsspørgsmål.
Havde fået weekend arbejde der slutted kl 3-4 om natten både Fredag og Lørdag og i dags timerne i går var jeg lige hjemme ved mine forældre på et sjældent besøg.

Er meget glad for det store arbejde du har lavet.
Og det virker helt efter hensigten. Det er super fedt at du har lyst og bruger så meget tid på at svare på spørgsmål. Er dybt imponeret.

Kan næsten forstå at du endda selv lære noget ved det og det må da også være lidt sjovt for dig selv, med sådanne udfordringer.

Jeg er typen der har problemer med at finde ud af hvilke muligheder der er for at lave tingene. Jeg ved ikke 100% hvor jeg skal kigge, eller hvordan jeg skal sætte det sammen ud fra en tutorial. Måden jeg lære bedst på er ved at lege med ting der er lavet og virker. Og ud fra dem læse nogle tutorial's om det der sker i scriptet (hvis jeg altså kan finde tutorial's om det).

Derfor prøver jeg også at lege lidt med tingene for at se hvad der ellers er af muligheder med sådan noget. Især nu, hvor der var meget mere i det end jeg troede. Så kan det jo være sjovt at se hvordan man lavede andre ting i samme dur. Altså gøre det samme, men med andre valg. Jeg sætter meget stor pris på det hele.
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