Vinnaren i pepparkakshustävlingen!
2010-11-03, 04:44
  #1
Medlem
hultass avatar
Hej!

Har suttit och försökt på alla möjliga vis pröva mig fram till hur jag ska göra för att få min data från databasen formaterad som jag vill.

Såhär ser min databas ut.

Tabeller
goalies
id
name
ingame (int)
shootout
team
matchup
id
t1
t2
teamratings
id (int)
team
os (int)
ob (int)
ds (int)
db (int)
Det jag vill göra är alltså att m.h.a. av värden i matchup ta fram olika värden från de andra tabellerna. Man kan säga att det är matchup som styr vad jag ska skriva ut.

Låt oss säga att Äpplena möter Bananerna på hemmaplan.

Då skriver vi in Äpplena som t1 i matchup och Bananerna som t2. Nu vill jag printa ut detta samtidigt som jag tar med mig alla olika värden från de andra tabellerna (som jag kan koppla ihop m.h.a. av "team").

Jag vill t.ex. skriva ut det hela såhär...

Kod:
Namn           OS     OB    DS    DB
(Namn)         (X)    (X)   (X)   (X)    Målvakt #1 (Ingame - Shootout) Målvakt #2 (Ingame - Shootout)
Äpplena         5       4      3    2    Kalle (2 - Bedrövlig) Conny (5 - Fantastisk)
Banerna         4       3      2    5    Anton (4 - Medel) Musse (3 - Bedrövlig)

Päronen         2       5      3    3    Pontus (4 - Bra) Gabriel (2 - Dålig)
Aprikose        4       2      5    4    Nisse (2 - Medel) Matte (4 - Bra)

Alltså varje matchup separerad med en rad emellan.

Jag kan utan problem strukturera upp det så jag får ut t1's (Äpplena's) värde i en sån tabell men går bet på hur jag gör för att få med t2's (Banerna's) värde i samma utskrift.

Detta är vad jag försökt med, och det fungerar faktiskt, men bara så länge man har en enda post i tabellen, annars så buggar det (bild).
Kod:
<?php
            $qry 
mysql_query("SELECT matchup.t1, teamratings.team, teamratings.os, teamratings.ob, teamratings.ds, teamratings.db FROM matchup, teamratings WHERE matchup.t1=teamratings.team");
            while(
$result mysql_fetch_array($qry)) {
                echo 
'<div style="width:100px; float: left;">'.$result['t1'].'</div><div style="width:40px; float: left;">'.$result['os'].'</div><div style="width:40px; float: left;">'.$result['ob'].'</div><div style="width:40px; float: left;">'.$result['ds'].'</div><div style="width:40px; float: left;">'.$result['db'].'</div><br>';
                
$qry2 mysql_query("SELECT matchup.t2, teamratings.team, teamratings.os, teamratings.ob, teamratings.ds, teamratings.db FROM matchup, teamratings WHERE matchup.t2=teamratings.team");
                while(
$result mysql_fetch_array($qry2)) {
                    echo 
'<div style="width:100px; float: left;">'.$result['t2'].'</div><div style="width:40px; float: left;">'.$result['os'].'</div><div style="width:40px; float: left;">'.$result['ob'].'</div><div style="width:40px; float: left;">'.$result['ds'].'</div><div style="width:40px; float: left;">'.$result['db'].'</div><br><br>';
                }
            }
        
?>

Så hur jag för att lösa buggen, gör jag ens på rätt sätt? Och hur får jag dessutom så jag kan infoga goalies på sidan som jag har i mitt exempel?

Tack på förhand
hultas
Citera
2010-11-03, 16:33
  #2
Medlem
AquaRegias avatar
Kod:
SELECT *
FROM goalies team1, goalies team2, teamratings teamr1, teamratings teamr2, matchup
WHERE
	matchup.t1 = team1.id AND
	matchup.t2 = team2.id AND
	teamr1.id = team1.id AND
	teamr2.id = team2.id

Något sånt kanske fungerar, det är dock en massiv join och kommer nog bli rätt segt om dina tabeller är för stora.
Citera
2010-11-03, 16:53
  #3
Medlem
Der_Richters avatar
Citat:
Ursprungligen postat av AquaRegia
Kod:
SELECT *
FROM goalies team1, goalies team2, teamratings teamr1, teamratings teamr2, matchup
WHERE
	matchup.t1 = team1.id AND
	matchup.t2 = team2.id AND
	teamr1.id = team1.id AND
	teamr2.id = team2.id

Något sånt kanske fungerar, det är dock en massiv join och kommer nog bli rätt segt om dina tabeller är för stora.

Liten notering här är att ovanstående är en implicit inre join, en syntax som det rekommenderas att man inte använder om man inte uttryckligen är ute efter SQL-92 stöd.

I den nya specen skall man (med goda skäl) använda en explicit join.

Alltså:

Select [kolumner]
from tabell1 as T1 inner join tabell2 as T2 on T1.[värde] = T2.[värde]
o.s.v.
where [sökvillkor]

Du bör formatera en resultat-tabell redan i SQL-servern, meddelst fråga. Som jag tolkar din kod nu så gör du det efter via flera olika frågor.
Citera
2010-11-03, 17:02
  #4
Medlem
Kod:
SELECT CASE WHEN T.Team = M.t1 THEN 1 ELSE 2 END AS [GroupRow], T.id, blablabla...
FROM Matchup M
JOIN TeamRating T ON T.Team = M.t1 OR T.Team = M.t2
LEFT JOIN Golies G ON G.Team = T.Team
ORDER BY 2, 1

Läste inte alltför noggrannt men tror det är någonting liknande ovanstående som du vill ha ut. Sedan får du se till att klienten slänger in en blankrad efter varje '2' i första kolumnen. Vad som görs är helt enkelt att vi får dubbelträffar på varje matchup som vi kategoriserar 1 eller 2 (hemma/borta). Beroende på vilken DB du använder så kan du få pill lite med syntax då jag uteslutande arbetar med och skriver kod till MS SQL.

Angående föregående kommentar angående massiv join så behöver du inte oroa dig. Med en väldesignad databas så kan vi lätt prata dussintals joinade tabeller/vyer/cte'er etc som agerar på hundratusentals rader och databasmotorn kommer fortfarande bara garva åt belastningen.

EDIT: Insåg precis att golies naturligtvis kommer att skapa ytterligare rader så hantera detta programatiskt eller skriv om för att hantera just målvakterna.
__________________
Senast redigerad av SirPatman 2010-11-03 kl. 17:05.
Citera
2010-11-03, 17:13
  #5
Medlem
hultass avatar
Tacksam för svar. Hann lösa det på ett annat sätt dock.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback