webForumDet fria alternativet

skriva ut fler rader under samma datum

PHP

7 svar · 472 visningar · startad av tanten

Medlem sedan nov. 20051 596 inlägg
Frågan#1

Om det körs tre lopp på solvalla den 13:e mars så skrivs detta ut tre gånger med koden nedan.
Jag skulle vilja gruppera alla lopp som ska springas samma datum och på samma bana under en enda rubrik. Start: Solvalla 13 mars och sedan de hästar som ska starta och i vad. Men hur gör man det? Jag kaninte tänka ut det... :(

while ($r = mysql_fetch_array($result)) 
	{
  	 echo "<p><span class=\"nytt\">Start: ".$r['bana']." ".date('j/n',strtotime($r['datum']))." </span><br />
    	<span class=\"fet\">".$r['namn']."</span> <br /> Lopp:".$r['loppNr']." Nummer:".$r['spårNr']." ".$r['sträcka']."".$r['starttyp']." ".$r['typ']."  ".$r['fnamn']." ".$r['enamn']."
   		<br /></p>";
	}
Medlem sedan dec. 20025 483 inlägg
#2

Skriv ut rubriken innan du träder in i loopen. Väl i loopen skriver du bara ut hästinformationen:

$r = mysql_fetch_array($result);
if ($r){
  echo "<p><span class=\"nytt\">Start: ".$r['bana']." ".date('j/n',strtotime($r['datum']))." </span><br /></p>";

  do {
    echo "<p><span class=\"fet\">".$r['namn']."</span> <br /> Lopp:".$r['loppNr']." Nummer:".$r['spårNr']." ".$r['sträcka']."".$r['starttyp']." ".$r['typ']."  ".$r['fnamn']." ".$r['enamn']." <br /></p>";
  } while ($r = mysql_fetch_array($result));
}
Medlem sedan nov. 20051 596 inlägg
#3

Kommer det fungera om man sedan matar in att det även ska springas lopp i Kalmar den 14:e, osv. Vågar inte riktigt testa så här dags då sidan ligger live, men måste man inte ha med startraden i någon loop ändå...

Medlem sedan dec. 20025 483 inlägg
#4

Nej, det är riktigt.

SQL-sats:

"select <fält av intresse> from t order by datum, bana"
$curr_date  = "";
$curr_track = "";
while ($r = mysql_fetch_array($result)){
  if ($r['datum'] != $curr_date && $r['bana'] != $curr_track){
    echo "<p><span class=\"nytt\">Start: ".$r['bana']." ".date('j/n',strtotime($r['datum']))." </span><br /></p>";
    $curr_date  = $r['datum'];
    $curr_track = $r['bana'];
  }
  echo "<p><span class=\"fet\">".$r['namn']."</span> <br /> Lopp:".$r['loppNr']." Nummer:".$r['spårNr']." ".$r['sträcka']."".$r['starttyp']." ".$r['typ']."  ".$r['fnamn']." ".$r['enamn']." <br /></p>";
}
Medlem sedan nov. 20051 596 inlägg
#5

Det fungerade jättebra... :bire
Just nu finns det bara en bana och ett datum men om några dagar får jag se om det fungerar med fler banor och datum, men det gör det säkert... Men loppnr kommer i fel ordning och det ser inte riktigt kul ut. Och jag har inte lyckats hitta på någon lösning för det heller. Hur får man med det...
Min select ser ut så här

$query = "SELECT s. * , b.namn as bana, stad, l. * , k.enamn, fnamn, h.namn as namn, t. *
FROM starta s
JOIN lopp l ON s.loppID = l.loppID
JOIN bana b ON l.banID = b.banID
JOIN kusk k ON s.kuskID = k.kuskID
JOIN hest h ON s.stallID = h.stallID
JOIN lopptyp t ON l.typID = t.typID
LEFT JOIN resultat r ON l.loppID = r.loppID
WHERE r.loppID is null
ORDER BY l.datum, bana";
{
Medlem sedan dec. 20025 483 inlägg
#6

Lägg till det fältet i ORDER BY efter bana.

Ett tips är att bara ta med de fält i SELECT-satsen du är intresserad av. Så i stället för att skriva s.*, skriver du ut fältnamnen som du ex. gjort med kusk- och hästnamnen. (Nu kan det ju i.o.f.s. vara så att du faktiskt är intresserad av samtliga fält, men skulle så ej vara fallet gör du klokt i att begränsa antalet returnerade fält.)

Medlem sedan nov. 20051 596 inlägg
#7

Tack Peter, det blev jättebra.
När det gäller ditt tips så är jag intresserad av alla fält i l, s, och t. utom ID-fälten. Gäller egentligen k också, fast jag ser nu att jag inte använde * där. Är det då fortfarande bättre att skriva ut alla som du föreslog. Blir ju en ganska lång rad av det.
Nu fick jag två rätta svar att markera, men väljer den första...
Tack igen!

Medlem sedan dec. 20025 483 inlägg
#8

(y)

Fördelarna med att endast välja de fält man är intresserad av är åtminstone tvåfald: Det kanske viktigaste är att det blir enklare, både för dig och andra som kanske skall läsa koden, att direkt se vilka fält som hämtas. Det andra är att färre data returneras vilket gör operationen snabbare och mer effektiv.

Skulle det vara så att någon tabell innehåller så många fält att det blir oöverskådligt att lista samtliga i SELECT-listan är det kanske befogat att använda ".*", alternativt se över tabellkonstruktionen.

263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
132 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
133 ms — ändringar (db)