Voor mijn statistiek database ben ik op zoek naar een methode om het uit een thuis resultaat te presenteren.
Daarbij wil graag weten weten hoeveel doelpunten de door de thuisclub zijn gemaakt en hoeveel door de uit spelende club.
in speek taal zou ik zeggen : als de hometeamid =1 tel dan de homescore_ft bijalkaar op en geef het resultaat terug als homescore.
dus in code:
Kan je misschien even vanuit MySQL een dumpje maken van je relevante database structuur en gegevens? Op die manier kan ik wat beter proberen wat de beste oplossing is.
Gewoon even op pastebin.be uploaden en de link hier plaatsen.
MySQL Create scripts waren makkelijker geweest. Dan kan ik ze namelijk direct in mijn MySQL gooien en testen. Nu moest ik handmatig de tabellen aanmaken en de data invoeren.
Als ik zo kijk, dan vraag ik me af of je niet gewoon krijgt wat je zou willen met een GROUP BY query. Je krijgt dan een goed overzicht van alle thuisdoelpunten per team.
Ik begin een gevoel te krijgen voor wat je wilt bereiken, maar de manier hoe je het nu aanpakt is het per wedstrijd georienteerd. Je zou dan eigenlijk vanuit 1 team willen weten hoeveel wedstrijden ze hebben gespeeld (ongeacht thuis of uit) en hoeveel ze hebben gewonnen (, gelijk hebben gespeeld en verloren).
Subqueries zijn aardig langzaam, maar als je het puur SQL wilt houden dan kan het onderstaande het resultaat leveren wat je zoekt. Maar ik zou je aanraden om gewoon de wedstrijden op te halen en dan in PHP te bepalen of het gewonnen/gelijk/verloren is.
SELECT DISTINCT 'home' AS `location`,
(SELECT COUNT(*)
FROM af_games as agw
WHERE agw.Home_Team_ID = ag.Home_Team_ID
AND agw.Home_Score_FT > agw.Away_Score_FT) AS 'won',
(SELECT COUNT(*)
FROM af_games as agt
WHERE agt.Home_Team_ID = ag.Home_Team_ID
AND agt.Home_Score_FT = agt.Away_Score_FT) AS 'tie',
(SELECT COUNT(*)
FROM af_games as agl
WHERE agl.Home_Team_ID = ag.Home_Team_ID
AND agl.Home_Score_FT < agl.Away_Score_FT) AS 'loss'
FROM af_games AS ag
WHERE ag.Season_ID = 99
AND ag.Home_Team_ID = 3
AND ag.Game_Played = 'Y'
UNION
SELECT DISTINCT 'away' AS `location`,
(SELECT COUNT(*)
FROM af_games as agw
WHERE agw.Away_Team_ID = ag.Away_Team_ID
AND agw.Away_Score_FT > agw.Home_Score_FT) AS 'won',
(SELECT COUNT(*)
FROM af_games as agt
WHERE agt.Away_Team_ID = ag.Away_Team_ID
AND agt.Away_Score_FT = agt.Home_Score_FT) AS 'tie',
(SELECT COUNT(*)
FROM af_games as agl
WHERE agl.Away_Team_ID = ag.Away_Team_ID
AND agl.Away_Score_FT < agl.Home_Score_FT) AS 'loss'
FROM af_games AS ag
WHERE ag.Season_ID = 99
AND ag.Away_Team_ID = 3
AND ag.Game_Played = 'Y';
SELECTDISTINCT'home'AS`location`,
(SELECT COUNT(*)
FROM af_games AS agw
WHERE agw.Home_Team_ID = ag.Home_Team_ID
AND agw.Home_Score_FT > agw.Away_Score_FT)AS'won',
(SELECT COUNT(*)
FROM af_games AS agt
WHERE agt.Home_Team_ID = ag.Home_Team_ID
AND agt.Home_Score_FT = agt.Away_Score_FT)AS'tie',
(SELECT COUNT(*)
FROM af_games AS agl
WHERE agl.Home_Team_ID = ag.Home_Team_ID
AND agl.Home_Score_FT < agl.Away_Score_FT)AS'loss'
FROM af_games AS ag
WHERE ag.Season_ID =99
AND ag.Home_Team_ID =3
AND ag.Game_Played ='Y'
UNION
SELECTDISTINCT'away'AS`location`,
(SELECT COUNT(*)
FROM af_games AS agw
WHERE agw.Away_Team_ID = ag.Away_Team_ID
AND agw.Away_Score_FT > agw.Home_Score_FT)AS'won',
(SELECT COUNT(*)
FROM af_games AS agt
WHERE agt.Away_Team_ID = ag.Away_Team_ID
AND agt.Away_Score_FT = agt.Home_Score_FT)AS'tie',
(SELECT COUNT(*)
FROM af_games AS agl
WHERE agl.Away_Team_ID = ag.Away_Team_ID
AND agl.Away_Score_FT < agl.Home_Score_FT)AS'loss'
FROM af_games AS ag
WHERE ag.Season_ID =99
AND ag.Away_Team_ID =3
AND ag.Game_Played ='Y';
Mocht je een ranking willen hebben voor een heel seizoen, dan zou je iets in de trent van onderstaand kunnen doen:
SELECT DISTINCT ag.Home_Team_ID,
(SELECT COUNT(*)
FROM af_games as agw
WHERE agw.Home_Team_ID = ag.Home_Team_ID
AND agw.Home_Score_FT > agw.Away_Score_FT) AS 'home_won',
(SELECT COUNT(*)
FROM af_games as agt
WHERE agt.Home_Team_ID = ag.Home_Team_ID
AND agt.Home_Score_FT = agt.Away_Score_FT) AS 'home_tie',
(SELECT COUNT(*)
FROM af_games as agl
WHERE agl.Home_Team_ID = ag.Home_Team_ID
AND agl.Home_Score_FT < agl.Away_Score_FT) AS 'home_loss',
(SELECT COUNT(*)
FROM af_games as agw
WHERE agw.Away_Team_ID = ag.Home_Team_ID
AND agw.Away_Score_FT > agw.Home_Score_FT) AS 'away_won',
(SELECT COUNT(*)
FROM af_games as agt
WHERE agt.Away_Team_ID = ag.Home_Team_ID
AND agt.Away_Score_FT = agt.Home_Score_FT) AS 'away_tie',
(SELECT COUNT(*)
FROM af_games as agl
WHERE agl.Away_Team_ID = ag.Home_Team_ID
AND agl.Away_Score_FT < agl.Home_Score_FT) AS 'away_loss'
FROM af_games AS ag
WHERE ag.Season_ID = 99
AND ag.Game_Played = 'Y'
SELECTDISTINCT ag.Home_Team_ID,
(SELECT COUNT(*)
FROM af_games AS agw
WHERE agw.Home_Team_ID = ag.Home_Team_ID
AND agw.Home_Score_FT > agw.Away_Score_FT)AS'home_won',
(SELECT COUNT(*)
FROM af_games AS agt
WHERE agt.Home_Team_ID = ag.Home_Team_ID
AND agt.Home_Score_FT = agt.Away_Score_FT)AS'home_tie',
(SELECT COUNT(*)
FROM af_games AS agl
WHERE agl.Home_Team_ID = ag.Home_Team_ID
AND agl.Home_Score_FT < agl.Away_Score_FT)AS'home_loss',
(SELECT COUNT(*)
FROM af_games AS agw
WHERE agw.Away_Team_ID = ag.Home_Team_ID
AND agw.Away_Score_FT > agw.Home_Score_FT)AS'away_won',
(SELECT COUNT(*)
FROM af_games AS agt
WHERE agt.Away_Team_ID = ag.Home_Team_ID
AND agt.Away_Score_FT = agt.Home_Score_FT)AS'away_tie',
(SELECT COUNT(*)
FROM af_games AS agl
WHERE agl.Away_Team_ID = ag.Home_Team_ID
AND agl.Away_Score_FT < agl.Home_Score_FT)AS'away_loss'
FROM af_games AS ag
WHERE ag.Season_ID =99
AND ag.Game_Played ='Y'
Mocht je die gelijk al in de juiste volgorde willen hebben, dan kan dat ook. Maar in dat geval wordt het geheel wel heel erg langzaam.
SELECT DISTINCT ag.Home_Team_ID,
(SELECT COUNT(*)
FROM af_games as agw
WHERE agw.Home_Team_ID = ag.Home_Team_ID
AND agw.Home_Score_FT > agw.Away_Score_FT) AS `home_won`,
(SELECT COUNT(*)
FROM af_games as agt
WHERE agt.Home_Team_ID = ag.Home_Team_ID
AND agt.Home_Score_FT = agt.Away_Score_FT) AS `home_tie`,
(SELECT COUNT(*)
FROM af_games as agl
WHERE agl.Home_Team_ID = ag.Home_Team_ID
AND agl.Home_Score_FT < agl.Away_Score_FT) AS `home_loss`,
(SELECT COUNT(*)
FROM af_games as agw
WHERE agw.Away_Team_ID = ag.Home_Team_ID
AND agw.Away_Score_FT > agw.Home_Score_FT) AS `away_won`,
(SELECT COUNT(*)
FROM af_games as agt
WHERE agt.Away_Team_ID = ag.Home_Team_ID
AND agt.Away_Score_FT = agt.Home_Score_FT) AS `away_tie`,
(SELECT COUNT(*)
FROM af_games as agl
WHERE agl.Away_Team_ID = ag.Home_Team_ID
AND agl.Away_Score_FT < agl.Home_Score_FT) AS `away_loss`
FROM af_games AS ag
WHERE ag.Season_ID = 99
AND ag.Game_Played = 'Y'
ORDER BY ((`home_won` * 3) + `home_tie` + (`away_won` * 3) + `away_tie`) DESC
SELECTDISTINCT ag.Home_Team_ID,
(SELECT COUNT(*)
FROM af_games AS agw
WHERE agw.Home_Team_ID = ag.Home_Team_ID
AND agw.Home_Score_FT > agw.Away_Score_FT)AS`home_won`,
(SELECT COUNT(*)
FROM af_games AS agt
WHERE agt.Home_Team_ID = ag.Home_Team_ID
AND agt.Home_Score_FT = agt.Away_Score_FT)AS`home_tie`,
(SELECT COUNT(*)
FROM af_games AS agl
WHERE agl.Home_Team_ID = ag.Home_Team_ID
AND agl.Home_Score_FT < agl.Away_Score_FT)AS`home_loss`,
(SELECT COUNT(*)
FROM af_games AS agw
WHERE agw.Away_Team_ID = ag.Home_Team_ID
AND agw.Away_Score_FT > agw.Home_Score_FT)AS`away_won`,
(SELECT COUNT(*)
FROM af_games AS agt
WHERE agt.Away_Team_ID = ag.Home_Team_ID
AND agt.Away_Score_FT = agt.Home_Score_FT)AS`away_tie`,
(SELECT COUNT(*)
FROM af_games AS agl
WHERE agl.Away_Team_ID = ag.Home_Team_ID
AND agl.Away_Score_FT < agl.Home_Score_FT)AS`away_loss`
Mocht je dit scoreboard altijd willen gebruiken, overweeg dan ook eens om er gewoon een VIEW van te maken. Op die manier heb je de gegevens altijd beschikbaar in een handzaam formaat. Maar let echt op de performance, want die 6 subqueries van me zijn dodelijk. Die worden per wedstrijd getriggered. Ik stel dan ook voor dat je uitgaat vanuit de teams die mee doen in een seizoen, maar om daar een goede query voor te schrijven heb ik wat meer database info nodig.
CREATE OR REPLACE
ALGORITHM = UNDEFINED
VIEW `ag_season_scoreboard`
(Season_ID,Team_ID,home_won,home_tie,home_loss,away_won,away_tie,away_loss)
AS SELECT DISTINCT ag.Season_ID, ag.Home_Team_ID,
(SELECT COUNT(*)
FROM af_games as agw
WHERE agw.Home_Team_ID = ag.Home_Team_ID
AND agw.Home_Score_FT > agw.Away_Score_FT) AS `home_won`,
(SELECT COUNT(*)
FROM af_games as agt
WHERE agt.Home_Team_ID = ag.Home_Team_ID
AND agt.Home_Score_FT = agt.Away_Score_FT) AS `home_tie`,
(SELECT COUNT(*)
FROM af_games as agl
WHERE agl.Home_Team_ID = ag.Home_Team_ID
AND agl.Home_Score_FT < agl.Away_Score_FT) AS `home_loss`,
(SELECT COUNT(*)
FROM af_games as agw
WHERE agw.Away_Team_ID = ag.Home_Team_ID
AND agw.Away_Score_FT > agw.Home_Score_FT) AS `away_won`,
(SELECT COUNT(*)
FROM af_games as agt
WHERE agt.Away_Team_ID = ag.Home_Team_ID
AND agt.Away_Score_FT = agt.Home_Score_FT) AS `away_tie`,
(SELECT COUNT(*)
FROM af_games as agl
WHERE agl.Away_Team_ID = ag.Home_Team_ID
AND agl.Away_Score_FT < agl.Home_Score_FT) AS `away_loss`
FROM af_games AS ag
WHERE ag.Game_Played = 'Y'
Heb je misschien voor mij ook nog de tabel die hoort bij de Teams? Ik kan dan eens kijken of ik die queries niet een stuk sneller kan krijgen. Misschien dat we met wat indexes nog wat kunnen bereiken. (binnen phpMyAdmin gewoon even naar tabje Export op Database niveau)
Ik heb er nu in ieder geval met 2 Indexes op Away_Team_ID en Home_Team_ID een goede 0,1 seconde eraf gesloopt (0,4 Sec ipv 0,5 Sec). Dat moet beter kunnen
Gerard,
Ik denk dat ik nu heb wat ik wilde hebben. aangezien de gegevens van voorgaande seizoen nooit meer zullen veranderen is dit voor het doel dat is ze gebruik snel genoeg.
Met de query wil statisch Pie-charts genereren.
Daarvoor gebruik ik phpgraphlib nu ben ik een NOOB, maar hoe kan ik kan ik een array vullen met variabelen?
even in gekort heb ik dit maar dat werk niet :-(