webForumDet fria alternativet

Strul i SQL

3 svar · 225 visningar · startad av Rozzi

RozziMedlem sedan maj 200115 inlägg
#1

Tjena allihop.. i skolan tycker dom att vi ska lära oss SQL vilket inte alls är dåligt.. vad som är dåligt är att vi inte får nån hjälp när vi kör fast i nått, så då får vi hitta egna "källor" till problemen, så vilken plats är bättre än webforum :e
hur som helst till problemet:
frågan lyder:
"I vilka VM har öppningsmatchens hemmalag också varit arrangerande nation?
Ledning: använd MIN på speldatum (i en sub-query) för att hitta varje VM’s öppningsmatch.
Svara årtal, hemmalag och bortalag."

relevanta tabeller i databasen:
games: {year, thegroup, game, teama, teamb, scorea, scoreb}
years: {year, hostnation...}
stad_alloc: {year, thegroup, game, stadium, thedate}

inte så svårt eller hur? yeah right

jag har tänkt mig att koden ska vara nått så här (vilken självklart är fel med det rätta svaret):

SELECT games.year, games.teama, teamb 
FROM games, years, stad_alloc
WHERE games.teama=years.hostnation
AND stad_alloc.thedate=(SELECT MIN(stad_alloc.thedate) FROM stad_alloc, games WHERE stad_alloc.game=games.game);

Detta blir fel svar... den ska alltså hitta öppningsmatchen genom subquering ..min(stad_alloc.thedate) för varje år som VM har spelats kontrollera vilka lag som spelade mot varandra genom ...WHERE stad_alloc.game=games.game

Problemet jag har är att den visar "fel" lag som spelar mot varandra typ lag A vs B år 1930, A vs C 1930, A vs D 1930 osv.
Rätt svar ska var 6 ggr, men jag får 20+

All hjälp uppskattas
Tack i förhand
Rozzi

LarsGMedlem sedan dec. 200012 464 inlägg
#2
SELECT games.year, games.teama, teamb 
FROM games
WHERE game in (select game from stad_alloc sa
where theDate = (select min(theDate) from stad_alloc
where year = sa.year))
and teama in (select hostnation from years
 where year = games.year)
RozziMedlem sedan maj 200115 inlägg
#3

Ahhh äntligen nån som svarat, och det är LarsG också lol mycket hjälpsam mod ;)
Men LarsG din kod är lite fel (Ja faktiskt) :p

(select min(theDate) from stad_alloc
where year = sa.year))

Den hänvisar till sig själv och då blir den ju knas :)
Och jag fick 67!! träffar med den koden...

Jag modifierade den lite (dvs fixade det ovan) och fick fram

SELECT distinct games.year, games.teama, games.teamb 
FROM games 
WHERE game in (SELECT game FROM stad_alloc 
WHERE theDate = (SELECT MIN(theDate) FROM stad_alloc, games WHERE stad_alloc.game = games.game)) 
AND teama IN (SELECT hostnation FROM years WHERE year = games.year);

Nu får jag 21 träffar, lika mycket som förut, fast nu har några fel spelade matcher försvunnit och rätta kommit till, mycket bra.. fast allt som allt är det ju fortfarande fel.
jag får fortfarande upp "dubbletter" dvs A vs B 1930 A vs C 1930 osv.
Kan det vara så att det är nått fel på databasen? För lärarna på universitet sa att det ibland inträffar fel när databasen kopieras (vilket vi gjorde i början av arbetet), men jag har inte haft några problem på dom andra frågor med dubbletter osv..
Arrgh jag blir galen snart
Hjälp!!

Tack i förhand
Rozzi

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Det är inget syntaktiskt fel med den referensen, däremot så har jag glömt ett villkor

SELECT games.year, games.teama, teamb 
FROM games
WHERE game in (select game from stad_alloc sa
where theDate = (select min(theDate) from stad_alloc
where year = sa.year)
[b]and year = games.year[/b])
and teama in (select hostnation from years
 where year = games.year)
125 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
122 ms — hämta tråd, inlägg och bilagor (db)