02 maj 2006

Inner joins

Idag provade jag vidare med att få artikel-sidan att läsa in mer än ArtID från artikel-tabellen. Jag diskuterade med Jonas och Jens. Efter att jag hade meckat en del kom Jonas på att svaret borde finnas i UPDATE-övningen. Den gjorde jag dagen innan jag åkte till Köpenhamn, men jag fick den aldrig att fungera. Och lösningen gicks igenom den när jag var bortrest.

Jag provade med den lösningen, och det fungerade! Så här blev det:
$sql = "SELECT artikel.* FROM artikel WHERE
ArtID='$artikel'";

...

while($minrad = mysql_fetch_array($result)) {

$titel = $minrad['Titel'];
$ar = $minrad['År'];
$pris = $minrad['Pris'];

//Skriver ut fakta om filmen
echo "<h2>" . $titel . "</h2>";
echo "Produktionsår: " . $ar . "<br />";
echo "Pris: " . $pris . " kr";
}
Det var en lättnad.

Då gav jag mig på INNER JOIN, med hjälp av boken. Jag provade SQL-frågor i phpMyAdmin, och lyckades koppla Namn i Regi-tabellen till Titel i Artikel via regisserar-tabellen. Så när jag angav t.ex. ArtID=1 så visades regissören för art. nr 1, d.v.s. Spirited away.
SELECT regi.Namn
FROM artikel INNER JOIN regisserar
ON artikel.ArtID = regisserar.ArtID
INNER JOIN regi
ON regisserar.RegiID=regi.RegiID
WHERE artikel.ArtID=1
Nu skulle jag använda det i artikel.php. Eftersom jag inte visste hur jag skulle använda det ihop med den SELECT-fråga jag redan hade så tog jag bort den gamla så länge. Trots detta fungerade inte INNER JOIN-frågan när jag använde den.

Efter lite klurande kom jag fram till att jag måsteange SQL-frågan från andra hållet. Det är ju från Regi jag vill hämta regissörens namn, och inte från artikeln. Ganska självklart, men när man är mitt inne i det så kan det vara svårt att komma på. Så då blev det så här istället:
SELECT regi.Namn
FROM regi INNER JOIN regisserar
ON regi.RegiID = regisserar.RegiID
INNER JOIN artikel
ON regisserar.ArtID=artikel.ArtID
WHERE artikel.ArtID=1
...i myAdmin. Jag skrev det på en rad i artikel.php, och ersatte 1 med querystringens ArtID, som jag hämtat till '$artikel'. Då fungerade det! När jag klickar på Spirited away på butikens förstasida får jag veta att Hayao Miyazaki har regisserat den. Fantastiskt.

Då gällde det bara att kombinera detta med info från Artikel-tabellen. Först provade jag med att lägga till en ny sql= -rad. Det fungerade inte. Det visade sig dock vara enkeltDet var enkelt gjort, med ett kommatecken i SELECT-frågan.

Nu började jag känna att jag behärskar det här någorlunda. Jag börjar komma in i det. Jämfört med tidigare, alltså.

Då gav jag mig på att infoga ytterligare en många-till många-tabell, för att få in vilka skådespelare som är med i filmen (här röstskådespelare). Först provade jag i phpMyAdmin att få fram Namn från Skådespelar-tabellen via ArtID i Artikel, så här:
SELECT skådespelare.SkådNamn
FROM skådespelare INNER JOIN spelar_i
ON skådespelare.SkådID = spelar_i.SkådID
INNER JOIN artikel
ON spelar_i.ArtID=artikel.ArtID
WHERE artikel.ArtID=1
Det funkade fint. Då gällde det bara att få in detta på artikel-sidan. Jag provade att bara lägga till det med kommatecken, bland det jag lagt in tidigare. Men det fungerade inte alls. Jag letade och letade bland SQL- och PHP-hjälpsidor. Inget svar. Det fanns säkert någonstans där, men det var i så fall svårhittat.

Jag fick hjälp av Mats. Man skulle göra en ny "Kör fråga" efter SQL-frågan,

// SQL-fråga, kopplar artikel o skådespelare via spelar_i
$sql = "SELECT skådespelare.SkådNamn FROM skådespelare
INNER JOIN spelar_i ON skådespelare.SkådID = spelar_i
.SkådID INNER JOIN artikel ON spelar_i.ArtID=
artikel.ArtID WHERE artikel.ArtID='$artikel'";

// Kör fråga
$result = mysql_query($sql, $connectionstring);

while($minrad = mysql_fetch_array($result)) {
$skadespelare.= $minrad['SkådNamn'] . ", ";
Då visade den alla skådespelare för aktuellt ArtID, med kommatecken mellan. För att trimma bort det kommatecken som blir efter sista namnet skriver man
echo "Skådespelare: " . substr($skadespelare, 0,
(strlen($skadespelare)-2));
Klockan är mycket, bäst att sätta lite fart. Ska försöka skapa en kundvagn.