Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

SQL Probleem

Anoniem
Ruudfeen
4 antwoorden
  • 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
  • 1. Post je table schema a.u.b.
    2. Wat doe je ongelooflijk moeilijk. Ik kan me niet voorstellen dat dit snel is, of is dat geen probleem?
    3. De SQL kennis is hier vast niet hoog genoeg om dit probleem op te lossen ;)
  • [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.
  • 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

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.