Avatar billede Slettet bruger
06. februar 2011 - 13:48 Der er 17 kommentarer og
1 løsning

Tælle i et udtræk antal ens bogstaver i en database tabel

Jeg oprettede et spørgsmål i MySQL tråden omkring noget liggende. Men løsningen blev i PHP så derfor laver jeg det nye spørgssmål her. Princippet i mit spørgsmål er sådan set det samme. Henviser til spørgsmålet til sidst i tråden her.
I mit spørgsmål har jeg en database tabel kaldet 'valg' med følgende kolonner:
[id][user][123]

Indholdet af databasen ser sådan ud:
[1][user1][1]
[2][user2][3]
[3][user2][2]
[4][user1][3]
[5][user1][1]
[6][user2][1]
[7][user2][3]

I det spørgsmål jeg vil henvise til giver det mig følgende udtræk. (user (antal-valgte-1'er)-(antal-valgte-2'er)-(antal-valgte-3'er)

user1 2-0-1
user2 1-1-2


Nu her jeg bare lavet min valg om til:
[id][user][abc]

Her vælger brugeren bogstaver istedet for tal.
Der er 2 versioner 100 point til hver rigtig:

version 1
Fx. bruger jeg bogstaverne a b og c, istedet for 1 2 og 3.

Hvis jeg i min database bytter 1 med a, 2 med b og 3 med c.
Så vil jeg gerne have et udtræk der er præcis mangen til det jeg har nu, altså:

user1 2-0-1 <-- antal (a'er)-(b'er)-(c'er)
user2 1-1-2


version 2
Samme som version 1 bare med bogstaver der ikke kommer lige efter hinanden.
1 byttes ud med et b, 2 med et j og 3 med et s.

Igen skal udtrækkene være på samme måde


Spørgsmålet jeg fik hjælp til tidligere:
http://www.eksperten.dk/spm/930768
Avatar billede cronaldo Nybegynder
06. februar 2011 - 14:59 #1
Hvad er det præcist du skal bruge det til?

Prøv lige at uddybe? Jeg kunne forestille mig, at det ville være nemmere at lægge det i 3 særskilte kolonner frem for i en.
06. februar 2011 - 20:51 #2
For information til andre medlemmer:  Det tidligere spoergsmaal der henvises til maa vaere http://www.eksperten.dk/spm/930768 .  Det drejede sig om at brugere af et system, 'User1', 'User2', o.s.v., gentagne gange foretager valg mellem alternativer, i det tilfaelde alternativerne 1, 2, og 3.  Der skulle saa rapporteres for hver user hvor mange gange de havde valgt hvert af alternativerne.  Det blev fastslaaet at der kunne vaere mere end tre alternativer, men antagelsen var at alternativerne altid ville vaere fortloebende.  Jeg kendte ingen mysql funktion der kunne klare tricktet, saa jeg foreslog en loesning hvor man fra php henter de raa data og saa i php sorterer og presenterer dem.

I dette spoersmaal version 1 er alternativerne stadigvaek fortloebende selv om de er bogstaver i stedet for tal.  ddd, det skulle vaere til at loese, men selv faar jeg naeppe tid de naeste 24 timer eller saa.  Maaske kan andre i mellemtiden foreslaa en loesning.

Hvad angaar version 2, saa maa det afklares hvordan man ved i hvilken raekkefoelge alternativerne skal vises.  Alternativerne vil ikke vaere fortloebende, men skal de altid vises i alfabetisk raekkefoelge?  Alternativerne b, j, og s skal vises med antal b foerst, saa antal j, og til sidst antal s, saa meget synes klart.  Men hvis alternativerne er d, q, og k skal antal d saa vises foerst og saa antal k og til sidst antal q (altsaa alfabetisk?)  Hvis ikke, hvordan ved man saa i hvilken raekkefoelge de skal vises?  Hvis du kan klarlaegge det precist, saa kan jeg (og maaske andre) spekulere paa en loesning paa det ogsaa.
Avatar billede cronaldo Nybegynder
06. februar 2011 - 22:10 #3
Det bekræfter min teori om, at man burde lave sin tabelstruktur om!

Tabellen burde indeholder:

id
user
valg1
valg2
valg3

:-)
Avatar billede Slettet bruger
07. februar 2011 - 04:17 #4
cronaldo --> vil det ikke give problemer hvis jeg fx også vil lave en liste med brugerens valg i den række følge som de har valgt det i?

Fx:
User1: 1,2,3,3,2,3,1
eller
User1: a,b,c,c,b,c,a
Avatar billede Slettet bruger
07. februar 2011 - 05:18 #5
Christian, og andre --> Jeg har tænkt lidt over det.
Kunne kan ikke bare bruge det script jeg linkede til, og så lave noget replace på bogstaverne.

Lige inden jeg skriver mere. b, j og s er bare tilfældige bogstaver for at have nogen.

Men hvis man kunne gøre det på den måde vil man selv kunne bestemme række følgen.
Hvis du trækker et b ud og replacer med 1 , j bliver replaced med 2 og s blev replaced med et 3 tal.

Nu kender jeg ikke så meget til det.
Men det var bare en tanke. Til noget inspiration.
Hvis man kan det, så kan man jo selv bestemme rækkefølgen bogstaver skal udtrækkes i. Hvis man så ville have b til at være nummer 3 kunne man bare lade det være den der bliver replaced med 3 istedet for s.
07. februar 2011 - 05:40 #6
Ja, for at kunne faa antal svar per alternativ skrevet ud i en bestemt raekkefoelge maa man enten kunne regne raekkefoegen ud ved at navnene paa alternativerne hoerer til en allerede defineret raekkefoelge saasom numerisk eller alfabetisk, eller ogsaa maa man et eller andet sted i koden, php eller mysql, fortaelle hvad raekkefoelgen skal vaere.  Jeg kan se to steder:  (1) I databasen ved at lave en tabel 'valgraekkefoelge' med kolonnerne raekkefoelge og valg saasom:

1 j
2 s
3 b

(2) I php koden ved at putte alternativerne i en array saaledes:

$raekkefoelge = array('j', 's', 'b');

Hvis du fortaeller du vil saa lader det sig lave.
Avatar billede Slettet bruger
07. februar 2011 - 12:51 #7
Altså måden en vil ha det lavet på er som i mit oprindelige indlæg.

Cronaldo's forslag er sådan set ok, dejligt med alternativer til det man spørg om.
Men selvom jeg ikke skal bruge svaret til andet end at lære, så vil jeg gerne have et svar på mit oprindelige spørgsmål.

Svaret jeg fik i det spørgsmål jeg linkede til gjorde nemlig at jeg også kunne udskrive en liste med hver brugers valg og i den rækkefølge som brugerne har lavet valgende, hvilket jeg også gerne skulle kunne.

Så for at sikre at hvis jeg engang skal bruge det her til noget. Så har jeg også mulighed for det.
Derfor er min databse tabel nemlig opbygget sådan.

Christian lige for at være sikker, for jeg ved ikke om vi taler forbi hinanden i indlæg #5 og #6.

Det jeg mente med rækkefølgen var sådan set et svar på dit spørgsmål i indlæg #2, om version 2. Altså om rækkefølgen er alfabetisk eller tilfældig. Kan godt være jeg har misforstået #6, men da jeg kan se at mit indlæg #5 kan misforståes vil jeg lige beskrive det lidt nærmere.

Jeg tænkte lidt over tingene og kom frem til at hvis det gav problemer med at lave et script til bogstaver, som ikke er i alfabetisk række følge, om man så ikke bare kunne genbruge dit script til at trække tal ud i.
Jeg ved ikke om det er besværligt eller dumt, da jeg ikke ved hvor dan det lige helt skal gøres. Men hvis min database tabel nu indholder valgende: j, s og b. Kunne man så ikke køre en replace funktion, hvor j, s og b bliver lavet om, (ikke i databasen, men bare i et script) til tallene 1, 2 og 3?
j=1, s=2 og b=3 når det så er gjort så køre tallene igennem dit script.
Når så jeg trækker det ud vil den have talt antal j'er i form af 1 taller, s'er i form af 2 taller osv.
Og når de skal udskrives vil det blive udskrevet rigtigt, fx:

User1 5-2-1 (j'er - s'er - b'er)
User2 1-5-2

På den måde vil man selv kunne vælge hvilke bogstaver den skal tælle som det føre og det sidste.

Ved ikke om det gav mere mening, ellers bare se bort fra dette forsøg på en løsnings ide, som jeg bare ikke selv kan føre ud i livet :)
Avatar billede Slettet bruger
07. februar 2011 - 13:32 #8
Arghhhh kan blive så sur på mig selv nogen gange.
Du havde jo forstået mit indlæg. Undskyld jeg misforstod dit.

Jeg kan godt se det smart i den måde som du fremlægger og det er også den måde jeg gerne vil ende op med, for så kan man altid selv bestemme rækkefølgen.

Men som sagt kan ikke helt lure hvordan det kan sættes sammen med den kode du kom med i det spørgsmål jeg linkede til.
07. februar 2011 - 18:10 #9
Ja, jeg tror jeg har forstaaet dig, og naar foerst computeren forstaar i hvad raekkefoelge alternativerne skal vises, for eksempel j foerst, saa s, og saa b, saa vil det vaere nogenlunde nemt at gaa til.  Mit spoergsmaal var saa hvordan du vil fortaelle computeren hvad raekkefoelgen skal vaere.  For nu at sige det selvfoelgelige saa kan vi daarligt forlange at komputeren skal laese denne traad for at finde ud af det.  Vi er noedt til enten at skrive det i databasen ved i tabellerne at nummerere valg-mulighederne eller at skrive det i php koden, for eksempel ved at lave en array med alle valgmulighederne i samme raekkefoelge som de skal udskrives i.  Hvis du regner med fra tid til anden at aendre paa valgmulighederne, for eksempel at du naeste maaned ogsaa vil have w som valgmulighed og at antal w saa skal vises foerst, saa er array-loesningen nok den nemmeste.  Men det bliver du nok noedt til at tage stilling og fortaelle foer jeg (eller andre) kan foreslaa loesninger.
Avatar billede Slettet bruger
07. februar 2011 - 22:19 #10
Hehe.. Nej, det kunne ellers være rart hvis computeren bare af sig selv, gjorde det man tænker på.

Men det er så det.
Jeg må nok sige jeg bedst vil kunne lide at gøre det i php..
Det er nok det som jeg lære mest af og det er jo det jeg prøver på lige nu :)
08. februar 2011 - 10:18 #11
Saa lykkedes puslespillet.  Jeg valgte for test at tillade hele ord i stedet for blot enkelte bogstaver som valgmuligheder.  Jeg lavede i php denne array der giver de tilladte valgmuligheder og deres raekkefoelge:

$valgmuligheder = array('sofus', 'kalot', 'cykel');

Skulle du senere oenske flere valgmuligheder foejer du dem til arrayen.

Saa antager jeg at du programmerer bruger-interfacen saaledes at brugeren kun kan valege mellem disse vaeerdier, for eksempel ved at lave en html form med en radiobutton for hver vaerdi i arrayen.  Derved soerges der for at database tabellen kun kommer til at indeholde valg af disse vaerdier.  For test anlagde jeg denne mysql tabel:

CREATE TABLE ddd_valg4(id INT, user VARCHAR(10), valg VARCHAR(10));

INSERT INTO ddd_valg4 VALUES(1, 'user1', 'sofus');
INSERT INTO ddd_valg4 VALUES(2, 'user1', 'sofus');
INSERT INTO ddd_valg4 VALUES(3, 'user1', 'sofus');
INSERT INTO ddd_valg4 VALUES(4, 'user1', 'cykel');
INSERT INTO ddd_valg4 VALUES(5, 'user1', 'cykel');
INSERT INTO ddd_valg4 VALUES(6, 'user2', 'sofus');
INSERT INTO ddd_valg4 VALUES(7, 'user2', 'kalot');
INSERT INTO ddd_valg4 VALUES(8, 'user2', 'kalot');

Med nedenstaaende php kode fik jeg dette resultat som du kan se i http://christianjorgensen.be/ddd_valg1.php :

user1 - 3 - 0 - 2
user2 - 1 - 2 - 0

Resultatet er korrekt men maaske en smule uoversigtelig.  Det ville hjaelpe hvis du lavede en tabel med de forskellige valgmuligheder som headers og resultaterne i raekker nedenfor.  Men det ligger udenfor dette spoergsmaal.

Her er koden:

//array til at gemme valgmuligheder og raekkefoelge
$valgmuligheder = array('sofus', 'kalot', 'cykel');

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

while($row = mysql_fetch_array($result))
{
  $user = $row['user'];
  $valg = $row['valg'];
  $count = $row['count'];

  //saa laver jeg en to-dimensional array. 
  $array[$user][$valg] = $count;
}

foreach($array as $user => $valg)
{
  echo $user;
  foreach($valgmuligheder as $value)
  {
    $fyldt = 0;
    foreach($valg as $valgt => $antal) if($valgt == $value) $fyldt = $antal;
    echo " - $fyldt";
  }
  echo "<br>";
}
Avatar billede Slettet bruger
08. februar 2011 - 12:51 #12
Det er helt perfekt.. God ide med at lave bogstaverne om til ord. Da jeg så der stod sofus, gav det mig faktisk en god ide hvad jeg kan bruge det til i praksis.

Super fedt. Og det er sådan set overskueligt. Så det passer mig perfekt.

Du har ordre by user. Kunne man bruge et af de valgte array uden at skulle gøre for meget. Hvis man ikke kan så er det lige meget som landet ligger lige nu. :)

1000 tak.
08. februar 2011 - 13:37 #13
ORDER BY user var fordi jeg troede at det var den raekkefoelge du ville have det skrevet ud i (jeg troede det forekom i dit oprindelige query, men jeg har lige set efter at det ikke er rigtigt.)  Det kan udelades.  Jeg forstaar ikke helt problemstillingen - vil du have userne i bestemt raekkefoelge men vil du undgaa at ordne raekkefoelgen i sql forespoergslen?  Hvis ja, hvad er aarsagen?
Avatar billede Slettet bruger
08. februar 2011 - 14:23 #14
Altså jeg tænkte bare at hvis man lavede en liste hvor man ville se hvem der havde flest Kalot'er, men at man stadig kan se hvor mange sofus'er brugeren har valgt.

Det er ikke noget jeg skal bruge til noget. Det var bare en tanke.
Ikke fordi der skulle gøres noget stort ud af det lige nu, det var bare hvis der var en nem løsning :)
08. februar 2011 - 15:39 #15
Jeg er vist tumpet idag, jeg forstaar ikke hvad du mener.  Med outputtet

user1 - 3 - 0 - 2
user2 - 1 - 2 - 0

hvis det havde vaeret i en tabel med overskrifter paa, saaledes:

bruger sofus kalot cykel
user1    3    0    2
user2    1    2    0

kan man se at user2 har flest kalot og samtidig hvor mange sofus user2 har.  Er det noget andet du er ude efter, i saa fald hvad?  Lav et eksempel.
Avatar billede Slettet bruger
08. februar 2011 - 16:06 #16
Det var bare om man kunne order by brugernes valg

Her har vi order by user:

bruger sofus kalot cykel
user1    3    0    2
user2    1    2    0

Sådan ville den også se ud hvis man valgte order by sofus eller cykel


Men hvis man ville order by kalot ville den se sådan ud:
bruger sofus kalot cykel
user2    1    2    0
user1    3    0    2


Det er ikke en nødvendighed.
Det er bare et interesse spørgsmål, om det var nemt at gøre.
Hvis ikke det er nemt og det kræver en masse så er det lige meget :O)
09. februar 2011 - 07:54 #17
Stort set alt kan lade sig goere, men saa er det som minimum noedvendigt et eller andet sted i programmet at angive hvad der skal ordnes efter, i dette tilfaelde ordnes efter kalot, og derefter skal der infoejes en ny funktionalitet som jeg ikke lige kan overskue.  Hvis det er noget du skal bruge foreslaar jeg at du opretter et nyt spoergsmaal.  Saa faar det opmaerksomheden af andre af Ekspertens medlemmer hvoraf nogen maaske i en haandevending kan foreslaa en loesning.
Avatar billede Slettet bruger
10. februar 2011 - 12:32 #18
Super. Det var bare det jeg skulle vide.
Hvis det var et stort arbejde ville jeg også på et tidspunkt, oprette et spørgsmål. Men hvis det var noget let ville det være spild af tid med et spørgsmål.

Tak skal du have.
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