Ga naar inhoud

SQL Probleem


anoniem

Aanbevolen berichten

Hallo, Ik heb de volgende query (voor MySQL 4.1): [code:1:a4ce4b1af7] SELECT G.Title, H.Name FROM ( (SELECT AVG(F.Pos-E.Pos) as AverageRaise, E.SongID FROM top2000 E, top2000 F WHERE E.Year=F.Year+1 AND E.SongID=F.SongID AND E.SongID IN ( SELECT DISTINCT A.SongID FROM top2000 A, top2000 B WHERE A.SongID=B.SongID AND A.Pos<B.Pos AND A.Year=B.Year+1 AND NOT EXISTS ( SELECT * FROM top2000 C, top2000 D WHERE C.SongID=A.SongID AND C.SongID=D.SongID AND D.Pos>=C.Pos AND D.Year>C.YEAR) AND NOT EXISTS ( SELECT * FROM top2000 C WHERE C.SongID=A.SongID AND NOT EXISTS ( SELECT * FROM top2000 D WHERE A.SongID=C.SongID AND C.SongID=D.SongID AND ABS(C.Year-D.Year)=1 ) ) ) GROUP BY E.SongID #ORDER BY E.SongID ) AS ResultA, song G, artist H) WHERE ResultA.AverageRaise=(SELECT MAX(AverageRaise) FROM ResultA) AND # ResultA.AverageRaise=MAX(ResultA.AverageRaise) AND G.SongID=ResultA.SongID AND H.ArtistID=G.ArtistID GROUP BY G.Title, H.Name; [/code:1:a4ce4b1af7] Deze query werkt gedeetelijk het bovenstuk werkt goed, ga er maar vanuit dat daar een tabel ResultA uitkomt met de velden 'AverageRaise' en 'SongID'. Nu wil ik daaruit de SongID met de grootste AverageRaise dat probeer ik in het laatste stuk te doen, maar ik krijg de melding: [code:1:a4ce4b1af7] ERROR 1146 (42S02): Table '2id30.resulta' doesn't exist [/code:1:a4ce4b1af7] Ik denk dat in de subquery "SELECT MAX(Aver...).." deze naam niet bestaat. Maar eigenlijk wil ik niet de hele query hier weer opnieuwe neerzetten. Een temporary table lost dit ook niet vanwege problemen met temporary tables in 4.1 Iemand een idee? Groet, Marcel
Link naar reactie
[quote:cb0379c411="Jaaap"] 3. De SQL kennis is hier vast niet hoog genoeg om dit probleem op te lossen ;)[/quote:cb0379c411] Aanwezige SQL kennis zal niet het grootste probleem zijn. Kennis van dit specifieke vraagstuk is denk ik belangrijker. En die kennis moet door de TS aangeleverd te worden. Om eerlijk te zijn heb ik niet veel zin om zo'n draak van een query helemaal uit te pluizen :D :wink: Ik kan me ook niet aan de indruk onttrekken dat dit makkelijker moet kunnen. Het lijkt een beetje alsof geforceerd alles via 1 enkele query moet worden uitgevoerd. Terwijl dat niet altijd de beste oplossing is.
Link naar reactie
Hallo, Beetje late reactie maar ben 2 dagen weggeweest, ook wel eens lekker...:). Ja ik had inderdaad het schema moeten posten komt ie: tables: song, artist, top2000 columns: song(SongID, Title, PublicationYear, ArtistID) artist(ArtistID, Name) top2000(ID,SongID,Pos,Year) Waarbij: Pos = Positie in top2000 van liedje 'SongID' en in jaar 'Year' dus bv: x,1,1,2000 geeft aan dat in 2000 het liedje met SongID 1 op nummer 1 staat (toevallig Bohemian Rhapsody...:) ). De query is wel redelijk snel nog gem. <3s. Wat de query probeert te doen: 1. Het selecteren van alle liedjes die gestegen zijn in opeenvolgende jaren (en ALLEEN in opeenvolgende jaren, liedjes die weg zijn geweest doen dus niet mee). Dus een liedje dat van 1999 tot en met 2000 in de top2000 staat en daarin gestegen is wordt geselecteerd, ook die van 2000 tot 2003 alleen gestegen is, maar 1 die bv in 1999 erin stond en toen van 2001 tot 2002 doet niet mee. (Note: gestegen is dus een lagere positie) 2. Van deze liedjes degene selecteren die gemiddeld het hardst gestegen is. Ik hoop dat dit duidelijker is. Groet en alvast bedankt, Marcel van Leeuwen
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...