php, hur fixa en "snyggare" lösning?
Detta är en situation jag stöter på ganska ofta när jag programmerar i php. Säg att vi har två tabeller tabell1 och tabell2. tabell1 har en 1 till många relation med tabell2. Säg nu att jag vill skriva ut all data, ordnat med avseende på relationen. Det enklaste är väl då kanske:
$result_table1 = mysql_query("SELECT * FROM `table1`");
while($row = mysql_fetch_assoc($result_table1)){
echo $row['foo'];
$result_table2 = mysql_query("SELECT * FROM `table2` WHERE `tabell1_id` = '{$row['id']}'");
while($row = mysql_fetch_assoc($result_table2)){
$row['bar'];
}
}
Detta känns dock inte riktigt bra, tänk om tabell2 innehåller hiskligt många poster som mysql måste gå igenom gång på gång för varje vända.. Jag brukar därför göra ungefär så här istället:
$result_table1= mysql_query("SELECT * FROM `tab1e1` ORDER BY `id` DESC");
$result_table2 = mysql_query("SELECT * FROM `table2` ORDER BY `table1_id` DESC");
$row_table2 = mysql_fetch_assoc($result_table2);
while($row_table1 = mysql_fetch_assoc($result_table1)){
echo $row_table1['foo'];
while(true){
if($row_table1['id'] == $row_table2['table1_id']){
echo $row_table1['bar'];
} else {
break;
}
$row_table2 == mysql_fetch_assoc($result_table2);
}
}
MEN, detta känns bara väldigt fel, vilket vanligen brukar innebära att det är fel. Men kanske kan man lösa det på ett mer graciöst sätt men med samma princip rent kodmässigt? Eller är det bara jag som inbillar mig att det första exemplet är långsammare, mysql borde ju som sagt vara optimerat för sånna här saker.. Det handlar ju trots allt om en väldigt central operation.. Vore bra om någon har vänligheten att sätta mig på plats när det gäller det här..
(Har inte testat några av kodexemplerna så syntax/tankefel kan mycket väl förekomma).