Miałem ten sam problem. Chciałem stworzyć widok pokazujący informacje z ostatniego roku, z tabeli z rekordami od 2009 do 2011. Oto oryginalne zapytanie:
SELECT a.*
FROM a
JOIN (
SELECT a.alias, MAX(a.year) as max_year
FROM a
GROUP BY a.alias
) b
ON a.alias=b.alias and a.year=b.max_year
Zarys rozwiązania:
- utwórz widok dla każdego podzapytania
- zastąp podzapytania tymi widokami
Oto zapytanie o rozwiązanie:
CREATE VIEW v_max_year AS
SELECT alias, MAX(year) as max_year
FROM a
GROUP BY a.alias;
CREATE VIEW v_latest_info AS
SELECT a.*
FROM a
JOIN v_max_year b
ON a.alias=b.alias and a.year=b.max_year;
Działa dobrze na mysql 5.0.45, bez znacznej utraty szybkości (w porównaniu z wykonaniem oryginalnego wyboru podzapytania bez żadnych widoków).