Tout d'abord, vous devez savoir que la création d'une table temporaire est tout à fait une solution réalisable. Mais dans les cas où aucun autre choix n'est applicable, ce qui n'est pas vrai ici !
Dans votre cas, vous pouvez facilement booster votre requête en tant que FrankPl souligné parce que votre sous-requête et votre requête principale sont toutes deux regroupées par le même champ. Vous n'avez donc pas besoin de sous-requêtes. Je vais copier et coller la solution de FrankPl par souci d'exhaustivité :
SELECT o.property_B, SUM(o.score1), SUM(o.score2)
FROM o
GROUP BY property_B;
Pourtant, cela ne signifie pas qu'il est impossible de rencontrer un scénario dans lequel vous souhaiteriez pouvoir indexer une sous-requête. Dans quels cas vous avez deux choix, le premier consiste à utiliser une table temporaire comme vous l'avez souligné vous-même, contenant les résultats de la sous-requête. Cette solution est avantageuse car elle est supportée par MySQL depuis longtemps. Ce n'est tout simplement pas faisable s'il y a une énorme quantité de données impliquées.
La deuxième solution consiste à utiliser MySQL version 5.6 ou supérieure . Dans les versions récentes de MySQL, de nouveaux algorithmes sont incorporés afin qu'un index défini sur une table utilisée dans une sous-requête puisse également être utilisé en dehors de la sous-requête.
[MISE À JOUR]
Pour la version modifiée de la question, je recommanderais la solution suivante :
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;
Mais vous devez travailler sur le HAVING
partie. Vous devrez peut-être le modifier en fonction de votre problème réel.