Avatar billede sevinding Juniormester
05. februar 2012 - 15:28 Der er 8 kommentarer og
1 løsning

Hvor mange ryttere mellem 20 og 25 år

Hej.
Jeg har dette, hvor jeg udregner alder:

DATEDIFF(wd.start, t.born) as alder

FROM
        alleaar AS wd
        INNER JOIN turen AS t ON wd.navn = t.id
        INNER JOIN teams AS te ON wd.hold = te.id

WHERE wd.year=$aar AND wd.navn = t.id

GROUP BY
    t.name HAVING year = $aar

ORDER BY nummer ASC

");



while($r = mysql_fetch_array($res))

{
$antaldage = $r['alder'];
$beregn = floor($antaldage/365);
$antaldage = $beregn ." Years  " . ($antaldage - ($beregn*365)) . " Days";

Nu vil jeg gerne vide hvor mange der er mellem 20 og 25 år.
Har prøvet med:

WHERE wd.year=$aar AND wd.navn = t.id AND alder BETWEEN 1 AND 25

Men det viser ikke en døjt. Skulle der være en der ligger inde med de vises sten, eller bare en løsning på det?
05. februar 2012 - 16:58 #1
Drejer det sig om hvor mange af deltagerne i en bestemt tur er mellem 20 og 25 år?  I så fald har du brug for en tabel med ryttere med rytter_id og fødselsdag (born), en tabel med ture med tur_id og dato (start), og en tabel der viser hvilke ryttere deltager i hvilke løb, for eksempel:

rytter
rytter_id born

tur
tur_id start

deltagere
tur_id rytter_id

Med sådanne tabeller finder du antallet af ryttere mellem 20 og 25 år der deltager i turen med tur_id = $tur (ikke testet):

SELECT COUNT(*) FROM deltagere d JOIN rytter r ON  d.rytter_id = r.rytter_id JOIN tur t ON d.tur_id = t.tur_id WHERE t.tur_id = $tur AND DATEDIFF(t.start, r.born) < 365*25 AND DATEDIFF(t.start, r.born) >= 365*20

Jeg kan ikke se, hvilke data du har i de tabeller du nævner, og det synes at du ikke bruger data fra tabellen teams.

Fortæl om jeg har forstået hvad du vil opnå, og fortæl om din data struktur.
Avatar billede showsource Seniormester
05. februar 2012 - 21:22 #2
Prøv at kikke på denne:

$sql = "SELECT (YEAR(CURDATE())-YEAR(dato))-(RIGHT(CURDATE(), 5)<RIGHT(dato, 5)) as alder FROM foesdag HAVING alder BETWEEN 35 AND 44";

feltet dato er et datefelt med fødselsdato.
Avatar billede sevinding Juniormester
06. februar 2012 - 04:32 #3
Hej Christian.
Sender lige det hele scriptet. Det er helt rigtigt med hvor mange i en tur der er mellem 20 og 25 år. Med dette trækker jeg alle ryttere ud for et bestemt år. Så er det jeg gerne vil dele dem op i forskellige aldersklasser.

<?php
$res = mysql_query("SELECT
MAX(wd.year) AS year,
wd.hold AS hold,
wd.nummer AS nummer,
wd.navn AS navn,
wd.start AS start,
t.flags AS flags,
t.id AS rytterid,
t.name AS ryttername,
t.country AS country,
t.logo AS logo,
t.born AS born,
te.id AS teamid,
te.deltaget AS deltaget,
te.name AS teamname,

DATEDIFF(wd.start, t.born) as alder

FROM
        alleaar AS wd
        INNER JOIN turen AS t ON wd.navn = t.id
        INNER JOIN teams AS te ON wd.hold = te.id

WHERE wd.year=$aar AND wd.navn = t.id AND alder BETWEEN 1 AND 25

GROUP BY
    t.name HAVING year = $aar

ORDER BY nummer ASC

");

while($r = mysql_fetch_array($res))

{
$antaldage = $r['alder'];
$beregn = floor($antaldage/365);
$antaldage = $beregn ." Years  " . ($antaldage - ($beregn*365)) . " Days";

$teamname = $r['teamname'];
if( strlen($teamname) > 28 )
{
$teamname = substr($teamname,0,28).'..';
}

$ryttername = $r['ryttername'];
if( strlen($ryttername) > 20 )
{
$ryttername = substr($ryttername,0,20).'..';
}

$snit_afrundet = number_format( $r1['gns'], 3, ",", "." );

        echo "<table width='630' border='0' cellspacing='0' cellpadding='0'><tr><td  style='border-bottom:ridge 1px #FFFF80;'>";
          echo "<table width='630' border='0' cellspacing='1' cellpadding='1'><tr>";
            echo "<td width='30' align='right' valign='bottom'>$r[nummer].</td>";
        echo "<td width='30' align='center' valign='bottom'><img src=$r[flags] width='15' height='15' border=0></td>";
        echo "<td width='185' align='left' valign='bottom'><img src=$r[logo] width='15' height='20' border=0>  <a href=http://www.tourfacts.dk/root/tour_de_france_riders.php?id=$r[rytterid] class='link2' target='_self'>". $ryttername ."</a></td>";
        echo "<td width='160' align='left' valign='bottom'>$antaldage</td>";
        echo "<td width='200' align='left' valign='bottom'><a href='teamriders.php?aar=$aar&hold=$r[teamid]&teamname=$r[teamname]' class='link2'>". $teamname ."</a></td>";

        echo "<td width='55' align='left' valign='bottom'><em><font color='#FF0000'>";

$out = mysql_query("SELECT * FROM out WHERE year = $aar AND name = $r[rytterid]");
while($o = mysql_fetch_array($out)) { echo "Stage: $o[etape]"; }

        echo"</font></em></td>";

      echo "</tr></table>";
        echo "</td></tr></table>";   

}

$number = 0;

?>

showsource.
Har ikke prøvet dit forslag, da det ser ud til at udregne alder fra i dag. Har jeg ret i det?
Avatar billede sevinding Juniormester
06. februar 2012 - 07:15 #4
Hej igen Christian.
Har siddet og rodet lidt med dit forslag, og fået det til at virke.
Send et svar så jeg kann blive gældfri.
06. februar 2012 - 08:21 #5
Jeg er nok for dum til det her.  For at kunne svare på spørgsmål der drejer sig om data er jeg nødt til at forstå dataernes struktur.  Jeg leder i dette spørgsmål efter en tabel for ryttere, hvor hver rytter kun står en gang med rytterens id, navn, fødselsdag, og lignende.  Er det tabellen 'turen'?  Tabellens navn kunne tyde på, at 'turen' i stedet er en tabel over deltagelse i ture, således at en rytter der i tidens løb har deltaget i ti forskellige ture vil forekomme i tabellen ti gange.  Er det således?  I så fald, hvis en rytter bliver indskrevet, lad os sige, som Ole Bo Hansen til et løb og som Ole Bo-Hansen til det næste løb og Ole Hansen til det tredje løb, så vil denne rytter komme til at tælle tredobbelt i statistikkerne.

Så er jeg også i tvivl om den select du viser i #3.  Får du med denne resultaterne trukket ud uden problemer?  DATEDIFF præsenterer dato forskellene i dage, så når du søger efter BETWEEN 1 AND 25 ville jeg tro du kun får ryttere med der er mindre end en måned gammel.  Og i mit system vil det ikke virke at sige 'alder BETEEN ...'. Jeg ville være nødt til at gentage 'DATEDIFF(wd.start, t.born) BETWEEN ...'

Så hvad synes du?  Skal vi give op og lade spørgsmålet ligge, eller er det umagen værd, at du prøver at forklare videre? 

(Jeg ved godt, at dette ikke er spørgsmålet, men jeg sad og legede med at strukturere dataerne for det jeg tror det drejer sig om.  Jeg ser tre slags 'ting,' ryttere, ture, og teams, som jeg ville lave tre forskellige tabeller for:

(1) 'ryttere' med id, navn, fødselsdag, måske adresse, medlemsnummer, o.s.v.
(2) 'ture' med id, dato, måske et navn, turens længde, o.s.v. (men ikke hvem der har deltaget i turen.)
(3) 'teams' med id, navn, o.s.v. (men ikke hvem der har deltaget i teamet.)

Ud over disse tre 'statiske' tabeller ville jeg så lave en tabel, 'deltagelse', med det der skete, det vil sige hvilke ryttere der deltog i hvilke ture som medlem af hvilke teams, og vel også hvad rytterens resultater var såsom tiden og placeringen. Tabellen kunne have felterne id, rytter_id, tur_id, team_id, tid, placering, o.s.v.

Med en sådan data/tabel struktur ville du nemt og bekvemt kunne trække alle slags oplysninger ud, også oplysninger du ikke havde tænkt på da du lavede tabellerne.)
06. februar 2012 - 10:08 #6
Jeg arbejdede så længe med #5 at jeg ikke så din #4.  Godt at det virker.
06. februar 2012 - 11:40 #7
Tak for lukning.  Men jeg er stadig nysgerrig om din datastruktur.
Avatar billede sevinding Juniormester
06. februar 2012 - 11:40 #8
Hej Christian.
Jeg er ked af at du havde alt det besvær, men jo det hele virker som det skal nu, også ovenstående script.
Jeg er ikke sikker på andet, end det var dig der hjalp mig med det i sin tid.
Avatar billede sevinding Juniormester
06. februar 2012 - 11:45 #9
Jeg har en tabel, hvor alle ryttere er tastet ind år for år.
En tabel (lidt ulogisk, men 'turen' skulle måske omdøbe den)med alle rytteres data, og en tabel med alle hold.
Til sidst en tabel hvor rytterene er delt ud på de hold, de har deltaget i det pågældende år.
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