Avatar billede AOT1977 Nybegynder
22. april 2013 - 23:11 Der er 20 kommentarer og
1 løsning

Hjælp til udtræk fra to tabller

Hej

Jeg har 2 tabller i mysql

1. tabel
ludom_dato

kolonner:
id
dato
tid

2. tabel
ludom_point

kolonner:
id
plads
nick
point

Mit udtræk skulle gerne ende ud til at se sådan ud:

f.eks. kolonne navn:

dato tid

nick point
nick point
nick point


f.eks. med data:

2013-04-01 12:30

test1 8
test2 6
test3 4

2013-04-01 13:30

test3 8
test1 6
test2 4

Nogle der kan hjælpe?
Avatar billede repox Seniormester
23. april 2013 - 05:47 #1
Hvad har du selv prøvet?
23. april 2013 - 07:46 #2
Der er egenligt to problemer i dit spørgsmål, først hvordan dataerne i mysql udtrækkes fra tabellerne og derefter hvordan dataerne præsenteres i php.  Det andet problem, hvordan dataerne præsenteres efter at de er trukket ud, vil sikkert ikke være så svært, men jeg kan ikke ud fra dine oplysninger se, hvordan det første problem kan løses, hvordan du kan trække dataerne ud fra tabellerne.  Du vil, så vidt jeg forstår, udtrække hvilke 'nicks' der er registreret på hvilke tidspunkter og hvor mange points disse nicks fik.  Men hvordan kender du tidspunktet for en nick?  Jeg kan ikke se noget link mellem de to tabeller.

Hvis du vil anvende to tabeller, en med dato og tid og en med nicks og points, så kan du i ludom_point tilføje en ekstra kolonne 'tidspunkt' som referer til ludom_dato tabellen, såsom:

ludom_dato
id dato tid
1  2013-04-01 12:30
2  2013-04-01 13:30
...

ludom_plads
id  tidspunkt  plads  nick  point
1  1  plads1  test1  8
2  1  plads2  test2  6
3  1  plads3  test3  4
4  2  plads4  test3  8
5  2  plads5  test1  6
6  2  plads6  test2  4
...

Men hvad er formålet med at have en separat tabel for tidspunktet?  Og hvad er formålet med at have en kolonne for dato og en anden kolonne for tid i stedet for at anvende datatypen DATETIME?  Med mindre der er specielle forhold du ikke har fortalt om, så kunne det måske være simpler med en enkel tabel såsom denne:

ludom
id  datotid  plads  nick  point
1  2013-04-01 12:30  plads1  test1  8
2  2013-04-01 12:30  plads2  test2  6
......

Fortæl hvordan du ser på ovenstående og om du vil være i stand til og interested i at tilpasse din tabelstruktur, så de nødvendige data kan udtrækkes.  Derefter kan vi kikke på hvordan du kan præsentere de udtrukne data i php.
23. april 2013 - 07:52 #3
.....  eller ligger landet således, at der på forskellige tidspunkter fyres en masse nicks af (du viser tre nicks på hvert tidspunkt, måske er der 25)?  I så fald kan jeg se formålet med at have tidspunktet i en separat tabel, så hvert tidspunkt kun skal skrives en enkelt gang og ikke en gang for hver nick.  Men så er du som sagt nødt til i ludom_point tabellen at have en kolonne der refererer til tidspunktet i ludom_dato tabellen, og så dunne du overveje i ludom_dato tabellen at have dato og tid i en enkelt kolonne og bruge datatypen DATETIME.
Avatar billede AOT1977 Nybegynder
23. april 2013 - 10:32 #4
Jeg er NY i det her, så der er sikkert nemmer måder at gøre det på.

Jeg skal bruge to php-side, en med resultat for turnering hvor det vil se ud som her:

2013-04-01 12:30

test1    8
test2    6
test3    4
test6    4
test22    2
test10    2
test9    2
test8    2

2013-04-01 13:30

test3    8
test4    8
test1    6
test6    6
test8    4
test5    4
test7    4
test2    4

En anden side men en highscore som gerne skulle se sådan ud:

1    test1    10
2    test3    8
    test5    8
4    test4    6
Osv osv
Avatar billede AOT1977 Nybegynder
23. april 2013 - 22:41 #5
@repox : noget som ikke virker.

@Christian_Belgien : hvis det er nemmer med en tabel så er det jeg gør.

det hele ligge kun i alfa version på localhost.
24. april 2013 - 08:16 #6
AOT1977, jeg står og skal afsted, jeg er nok tilbage i morgen tidlig.  I mellemtiden nogle spørgsmål med hensyn til tabelstrukturen og dine data.  Fra det du beskriver i #4 kunne det se ud til at en turnering fandt sted 1 april 2013, og der var to runder, en klokken 1230 og en klokken 1330.  I hver turneringsrunde var der 8 'tests' der hver fik points.  Det du så vil have vist på din første php side forstår jeg godt.  Men på den anden php side, vil du have vist den højeste score en bestemt test nogen sinde har opnået, eller vil du vise den højeste score en test har opnået i en bestemt turnering?  Hvis du vil vise de højeste scores i en bestemt turnering, så er du også nødt til i dine tabeller at definere en turnering.  Det kunne lede til brug af to, eller endda tre, tabeller, såsom:

turnering
id dato plads
1  2013-4-1 København
2  2013-4-13 Odense
..

runde
id turnering tid
1  1  12:30
2  1  13:30
3  2  10:30
..

(Altså turnering nummer 1 har to runder, runde 1 klokken 12:30 og runde 2 klokken 13:30.  Turnering nummer 2 har en enkelt runde, runde nummer 3 10:30.)

resultater
id runde nick  points
1  1  test1  8
2  1  test2  6
..
7  2  test1  6
8  2  test2  4

Hvad mener du derom?  Hvis jeg har gættet forkert med hensyn til de underliggende dataer, turneringer, runder, o.s.v., så forklar nærmere.
Avatar billede AOT1977 Nybegynder
24. april 2013 - 16:24 #7
Der gives point efter følgende model:

2 personers spil:
1. pladsen: 8 point
2. pladsen: 6 point
3. pladsen: 4 point
4. pladsen: 2 point

3 personers spil:
1. pladsen: 8 point
2. pladserne: 6 point
3. pladserne: 2 point

4 personers spil:
1. pladsen/rne: 8 point
2. pladsen/rne: 6 point
3. pladserne: 4 point

Makkerspil:
1. pladserne: 8 point
2. pladserne: 6 point
3. pladserne: 4 point

Lad os lege at vi har 16 deltager med i en turnering hvor de spiller 1 mod 1 (2 personers spil) taber man en kamp er man ude af turneringen, dvs der er 8 der ingen point få og 8 der få point, på siden hvor jeg indtaster resultatet skriver jeg:
Hvornår turnering startet eks.
2013-04-24 12:30
Så resultatet for turneringen:
Nick    plads    point
Lis    1    8
Max    2    6
Bo    3    4
Ole    3    4
Maria    4    2
Jens    4    2
Pia    4    2
Jette    4    2

Lad os lege at vi har 16 deltager med i anden turnering hvor de spiller 2 mod 2 (makkerspil) taber man en kamp er man ude af turneringen, dvs der er 8 der ingen point få og 8 der få point, på siden hvor jeg indtaster resultatet skriver jeg:
Hvornår turnering startet eks.
2013-04-24 13:30
Så resultatet for turneringen:
Nick    plads    point
Lis    1    8
Max    1    8
Bo    2    6
Ole    2    6
Maria    3    4
Jens    3    4
Pia    3    4
Jette    3    4

De eneste data jeg få fra en turnerig er:

Dato
Tid
Nicks på dem der skal havde point
Deres plads
Deres point

Håber det gav en idé og hjalp, hvis det er kan vi også tage en snak på skype hvis det er.
25. april 2013 - 08:29 #8
Det du ikke har forklaret og som jeg ikke har forstået er dette.

Du siger i #4:

En anden side men en highscore som gerne skulle se sådan ud:

1    test1    10
2    test3    8
    test5    8
4    test4    6

Vil du vide hvor mange points medlemmer har fået ialt i al den tid de har spillet?  Således, at efter de to turneringer du nævner ovenfor, hvis det er de første turneringer der nogensinde er spillet, bliver highscore:

1.  Lis 16
2.  Max 14
3.  Bo 10
...

Og hvis der dagen efter spilles flere turneringer hvor Lis får 10 points, Max 14, og Bo 8 bliver highscore:

1.  Max 28
2.  Lis 26
3.  Bo 18
...

Hvor mange skal der stå på highscore listen?  Ubegrænset, således at hvis der i tidens løb er 87 der har spillet og fået points får highscore listen 87 rækker?  Eller de højeste 10?  Eller??
Avatar billede AOT1977 Nybegynder
25. april 2013 - 14:42 #9
Ja lige som du skriver.

Den skal være ubegrænset.
25. april 2013 - 21:37 #10
Så tror jeg, at jeg er ved at forstå situationen.  En turnering identificeres ved dens dato og starttidspunkt.  I ludom_point tabellen vil der være et antal rækker (i dit eksempel otte rækker) der hører til den samme turnering, altså samme dato og tid.  Så jeg kan se det fornuftige i at holde dato og tid i en særskilt tabel, ludom_dato.  Men så er du nødt til i ludom_point tabellen at have en kolonne med ludom_dato id'en.  Ellers kan der ikke holdes rede på hvilke points der hører til hvilke turneringer.  Og jeg foreslår som sagt at gemme dato og tid i en enkelt kolonne, med datatype DATETIME, i stedet for i to kolonner.

Så i det følgende går jeg ud fra disse tabeller:

ludom_dato
id datotid

ludom_point
id dato_id plads nick point

For så i din php fil at udtrække og præsentere pointene, så er her en "quick and dirty" måde det kan gøres på.  Jeg må lige sige, at det er nogen tid siden jeg selv har arbejdet med disse ting, og jeg har ikke testet det, men det følgende burde virke.

<?php
......
..forbindelse til databasen [jeg går ud fra at du selv har check på det.]
......

$result1 = mysql_query("SELECT * FROM ludom_dato");
while($turnering = mysql_fetch_array($result1))
{
    $turnering_id = $turnering['id'];
    $turnering_datotid = $turnering['datotid'];
    echo $turnering_datotid."<br>";
    $result2 = mysql_query("SELECT * FROM ludom_point WHERE dato_id = $trnering_id");
    while($point = mysql_fetch_array($result2))
    {
        echo $point['nick']." " .$point['point']."<br>";
    }
}
.......
?>

Altså først henter du alle dato-tid'erne.  For hver dato-tid, i den yderste while løkke, skriver du dato-tid'en ud og så henter du alle nicks/points for den pågældende dato-tid og, i den inderste while løkke, udskriver disse nicks og points.

Dine highscores kunne så klares således:

<?php
....... forbindelse med databasen...

$i = 1;
$result = mysql_query("SELECT nick, SUM(point) score FROM ludom_point GROUP BY nick ORDER BY score DESC");
while($highscore = mysql_fetch_array($result))
{
    echo $i ." ".$highscore['nick']. " " . $highscore['score']."<br>";
    $i++;
}
?>

Her giver du først en variabel $i værdien 1.  Det skal du bruge for at kunne nummerere dine highscores.  Derefter henter du alle de forskellige nicks, og for hver nick henter du summen af points og kalder det 'score'.  Det henter du i rækkefølge med de højeste scores først.  For hver score, i while løkken, skriver du $i, som til at begynde med er 1, og derefter den første nick med totalscore, og derefter forøger du $i med 1.  Derefter skriver du på en ny linje $i, som nu er 2, plus den anden nick med dennes totalscore, og du forøger igen  $i med 1.  Og så videre.

Nu vil jeg sige, at efterhånden som du får en del turneringer i databasen, så kan det gå hen og blive nogle meget lange php sider.  Du vil så velsagtens gerne begrænse udskriften, for eksempel for turneringer i en bestemt måned eller år.  Du vil sikkert også ønske at forbedre udskriften med nogle overskrifter og måske placere rækkerne i en tabel.  Det ligger alt sammen udenfor dette spørgsmål.
Avatar billede AOT1977 Nybegynder
26. april 2013 - 11:14 #11
Super, jeg kigger og tester det lige sener i dag, så vender jeg tilbage.

~Allan
Avatar billede AOT1977 Nybegynder
26. april 2013 - 15:49 #12
Hej

highscore virker fint, 10.000 tak.

Den anden få jeg kun dato og kl, ingen nick og point
26. april 2013 - 16:22 #13
Du har vel kompenseret for min turkfejl, i

$result2 = mysql_query("SELECT * FROM ludom_point WHERE dato_id = $trnering_id");

skulle det naturligvis have været $turnering_id

Hvis du har, så lad os undersøge hvad der er galt med forespørgslen $result2 ved midlertidigt at ændre

$result2 = mysql_query("SELECT * FROM ludom_point WHERE dato_id = $turnering_id");

til

$result2 = mysql_query("SELECT * FROM ludom_point WHERE dato_id = $turnering_id") or die(mysql_error());

og fortæl om du får en fejlmelding og hvilken fejlmelding det er.
Avatar billede AOT1977 Nybegynder
26. april 2013 - 17:15 #14
den skriver den første datotid og så sker der ikke mere
Avatar billede AOT1977 Nybegynder
26. april 2013 - 17:16 #15
og har rettet dit manglene u ;)
26. april 2013 - 19:24 #16
Har du prøvet at indsætte 'or die(mysql_error())
Avatar billede AOT1977 Nybegynder
26. april 2013 - 21:14 #17
Ja, så er det den skriver den første datotid og så sker der ikke mere, ingen fejlmelding
Avatar billede AOT1977 Nybegynder
26. april 2013 - 21:21 #18
Hvis jeg ikke har 'or die(mysql_error()) med så skriver den kun de 3 datotid :
sådan:
2013-04-22 12:30:00
2013-04-22 13:30:00
2013-04-22 14:30:00
Avatar billede AOT1977 Nybegynder
26. april 2013 - 22:48 #19
Her lige oprette et sprøgsmål du måske kan hjælpe med:
http://www.eksperten.dk/spm/980388
Avatar billede AOT1977 Nybegynder
28. april 2013 - 11:25 #20
åååh ja nu har jeg fundet ud af fejlen det var mig der havde skrevet forkert så det virker fint.

så hvis du vil smmide et svar så giver jeg point og 10.000 tak for din hjælp Christian_Belgien
28. april 2013 - 19:43 #21
Det var godt.  Hermed svar.
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