Przede wszystkim musisz wiedzieć, że stworzenie tabeli tymczasowej jest absolutnie wykonalnym rozwiązaniem. Ale w przypadkach nie ma innego wyboru, co nie jest tutaj prawdziwe!
W Twoim przypadku możesz łatwo ulepszyć swoje zapytanie jako FrankPl wskazano, ponieważ podzapytanie i główne zapytanie grupują się według tego samego pola. Więc nie potrzebujesz żadnych podzapytań. Zamierzam skopiować i wkleić rozwiązanie FrankPl ze względu na kompletność:
SELECT o.property_B, SUM(o.score1), SUM(o.score2)
FROM o
GROUP BY property_B;
Nie oznacza to jednak, że nie można natknąć się na scenariusz, w którym chciałbyś zindeksować podzapytanie. W takich przypadkach masz dwie możliwości. Pierwszą z nich jest użycie tabeli tymczasowej, jak sam wskazałeś, zawierającej wyniki podzapytania. To rozwiązanie jest korzystne, ponieważ jest wspierane przez MySQL od dłuższego czasu. Jest to po prostu niewykonalne, jeśli w grę wchodzi ogromna ilość danych.
Drugim rozwiązaniem jest użycie MySQL w wersji 5.6 lub nowszej . W ostatnich wersjach MySQL zostały włączone nowe algorytmy, dzięki czemu indeks zdefiniowany w tabeli używanej w podzapytaniu może być również używany poza podzapytaniem.
[AKTUALIZACJA]
W przypadku edytowanej wersji pytania polecam następujące rozwiązanie:
SELECT o.property_B, SUM(IF(o.property_A = 'specific_A', o.score1, 0)), SUM(o.score2)
FROM o
GROUP BY property_B
HAVING SUM(IF(o.property_A = 'specific_A', o.score1, 0)) > 0;
Ale musisz popracować nad HAVING
część. Być może trzeba będzie to zmienić zgodnie z rzeczywistym problemem.