वर्तमान में मैं league_standing
नामक एक तालिका का उपयोग करके नीचे दिए गए परिणाम को प्राप्त कर रहा हूं और प्रत्येक मैच के बाद इसे अपडेट कर रहा हूं। मैं तालिका matches
के खिलाफ एक प्रश्न के साथ करने में सक्षम होना चाहता हूं।दो कॉलम में मौजूद विदेशी कुंजी द्वारा कॉलम कैसे समेटें?
Teams
एक दूसरे को दो बार, दोनों घर में और बाहर खेलते हैं। गौर करें कि team_id
दो कॉलम में है home_team_id
और away_team_id
+----------------------------------+
| Matches |
+----------------------------------+
| id |
| league_id (FK League) |
| season_id (FK Season) |
| home_team_id (FK Team) |
| away_team_id (FK Team) |
| home_score |
| away_score |
| confirmed |
+----------------------------------+
यहाँ मैं क्या कोशिश की, लेकिन विफल रहे हैं:
select team.name, HomePoints + AwayPoints points
from team join (
select team.id,
sum(case when home.home_score > home.away_score then 3
when home.home_score = home.away_score then 1 else 0 end) HomePoints,
sum(case when away.away_score > away.home_score then 3 else 0 end) AwayPoints
from team
join matches home on team.id = home.home_team_id
join matches away on team.id = away.away_team_id
WHERE home.league_id = 94
AND home.season_id = 82
AND home.confirmed IS NOT NULL
group by id
) temp on team.id = temp.id
order by points desc;
यह मुझे दे रहा है गलत अंक:
और यह मुझे होम टीम के लीग_स्टैंडिंग का सही परिणाम देता है केवल
SELECT * FROM
(
SELECT team.name, home_team_id AS team_id,
COUNT(*) AS played,
SUM((CASE WHEN home_score > away_score THEN 1 ELSE 0 END)) AS won,
SUM((CASE WHEN away_score > home_score THEN 1 ELSE 0 END)) AS lost,
SUM((CASE WHEN home_score = away_score THEN 1 ELSE 0 END)) AS drawn,
SUM(home_score) AS goalsFor,
SUM(away_score) AS goalsAgainst,
SUM(home_score - away_score) AS goalDifference,
SUM((CASE WHEN home_score > away_score THEN 3 WHEN home_score = away_score THEN 1 ELSE 0 END)) AS points
FROM matches
INNER JOIN team ON matches.home_team_id = team.id
WHERE league_id = 94
AND season_id = 82
AND confirmed IS NOT NULL
GROUP BY home_team_id
UNION
SELECT team.name, away_team_id AS team_id,
COUNT(*) AS played,
SUM((CASE WHEN away_score > home_score THEN 1 ELSE 0 END)) AS won,
SUM((CASE WHEN home_score > away_score THEN 1 ELSE 0 END)) AS lost,
SUM((CASE WHEN home_score = away_score THEN 1 ELSE 0 END)) as drawn,
SUM(away_score) AS goalsFor,
SUM(home_score) AS goalsAgainst,
SUM(away_score - home_score) AS goalDifference,
SUM((CASE WHEN away_score > home_score THEN 3 WHEN away_score = home_score THEN 1 ELSE 0 END)) AS points
FROM matches
INNER JOIN team ON matches.away_team_id = team.id
WHERE league_id = 94
AND season_id = 82
AND confirmed IS NOT NULL
GROUP BY away_team_id
) x
GROUP BY team_id
ORDER BY points DESC;
यदि यह मदद करता है, मेरी डेटाबेस स्कीमा:
मैं अटक रहा हूँ! आशा है कि आप मदद कर सकते हैं।
ऐसा मत करो। डेटाबेस सामान्यीकरण के नियमों में से एक गणना गणना मूल्यों को संग्रहित नहीं करना है। आप अन्य टेबल पर एक चुनिंदा क्वेरी चलाकर हमेशा स्टैंडिंग प्रस्तुत कर सकते हैं। –
@DanBracuk तो मैचों पर एक चुनिंदा क्वेरी चलाने के लिए बेहतर होगा और फिर स्टैंडिंग की गणना करने के लिए PHP का उपयोग करें? – Jonathan