Just nu i M3-nätverket
Jump to content

Högsta serien (bowling)


Poj

Recommended Posts

SELECT team_resultat.medlem_id, team_medlem.namn, resultat_sparad, serie1 as serie 
FROM team_resultat LEFT JOIN team_medlem ON team_resultat.medlem_id = team_medlem.medlem_id  
JOIN team_samling ON team_resultat.match_id = team_samling.match_id 
WHERE datum >= current_date - interval '5' day 
UNION ALL SELECT team_resultat.medlem_id, team_medlem.namn, resultat_sparad, serie2 as serie
FROM team_resultat 
LEFT JOIN team_medlem ON team_resultat.medlem_id = team_medlem.medlem_id  
JOIN team_samling ON team_resultat.match_id = team_samling.match_id
WHERE datum >= current_date - interval '5' day 
UNION ALL SELECT team_resultat.medlem_id, team_medlem.namn, resultat_sparad, serie3 as serie 
FROM team_resultat 
LEFT JOIN team_medlem ON team_resultat.medlem_id = team_medlem.medlem_id  
JOIN team_samling ON team_resultat.match_id = team_samling.match_id 
WHERE datum >= current_date - interval '5' day 
UNION ALL SELECT team_resultat.medlem_id, team_medlem.namn, resultat_sparad, serie4 as serie 
FROM team_resultat LEFT JOIN team_medlem ON team_resultat.medlem_id = team_medlem.medlem_id  
JOIN team_samling ON team_resultat.match_id = team_samling.match_id  
WHERE datum >= current_date - interval '5' day
ORDER BY serie desc LIMIT 1

Hej. Jag får ut högsta slagna serien i helgen med denna fråga.

Det har fungerat bra ända till denna veckan när 2 spelare slog samma höga resultat, det är bara en som visas dvs den som kommer först i alfabetet.

 

Hur ska man göra för att få med alla som har slagit högsta resultatet?

Jag vill inte ha en lista med dom 5 högsta utan bara det högsta resultatet. 

 

Link to comment
Share on other sites

Beroende på vilken databashanterare du kör finns det olika varianter:

 

   with cte as
   (
    SELECT team_resultat.medlem_id, team_medlem.namn, resultat_sparad, serie1 as serie
    FROM team_resultat LEFT JOIN team_medlem ON team_resultat.medlem_id = team_medlem.medlem_id  
    JOIN team_samling ON team_resultat.match_id = team_samling.match_id
    WHERE datum >= current_date - interval '5' day
    UNION ALL SELECT team_resultat.medlem_id, team_medlem.namn, resultat_sparad, serie2 as serie
    FROM team_resultat
    LEFT JOIN team_medlem ON team_resultat.medlem_id = team_medlem.medlem_id  
    JOIN team_samling ON team_resultat.match_id = team_samling.match_id
    WHERE datum >= current_date - interval '5' day
    UNION ALL SELECT team_resultat.medlem_id, team_medlem.namn, resultat_sparad, serie3 as serie
    FROM team_resultat
    LEFT JOIN team_medlem ON team_resultat.medlem_id = team_medlem.medlem_id  
    JOIN team_samling ON team_resultat.match_id = team_samling.match_id
    WHERE datum >= current_date - interval '5' day
    UNION ALL SELECT team_resultat.medlem_id, team_medlem.namn, resultat_sparad, serie4 as serie
    FROM team_resultat LEFT JOIN team_medlem ON team_resultat.medlem_id = team_medlem.medlem_id  
    JOIN team_samling ON team_resultat.match_id = team_samling.match_id  
    WHERE datum >= current_date - interval '5' day
   )
   select * from cte t1
   where not exists (select * from cte t2
                     where t2.serie > t1.serie)

 

Dvs. ta samma select som tidigare, och returnera de rader som har högst värde.

 

 

Har din dbms stöd för FETCH FIRST?

 

Byt ut din LIMIT 1 mot

FETCH FIRST 1 ROWS WITH TIES

:angry:

Link to comment
Share on other sites

Nej, MySQL har LIMIT.

 

Det finns två lösningar som fungerar på motsvarande sätt som mitt cte-förslag.

 

1. Skapa en vy för din nuvarande select. Använd den som "cte".

 

2. Klipp och klistra, ta hela din stora SELECT och klistra in som "cte".

 

 

(Svårt att fö överblick då e-forum har för smala rutor att skriva/läsa i...)

Link to comment
Share on other sites

En vy är en "färdig select som sparas i databasen", och man i sin tur kan göra nya select mot (precis som mot en vanlig tabell).

 

cte, common table expression, är i princip en engångs-vy. (Men nog inget som MySQL har.)

 

 

 

Ta din stora SELECT och gör NOT EXISTS som i mitt förslag ovan.

 

 

Eller kanske lite enklare:

 

select ...

from ...

 

where serie = (select max(serie)

               from ...)

 

Kommer returnera de rader som har serie = max(serie), oavsett om det är en eller flera spelare.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...