För det första ska man undvika att använda GROUP BY om man inte behöver det för att räkna med aggregerande funktioner PER en partition av värden från de inblandade fälten. Att dömma av hur dina frågor ser ut här, så räknar du ingenting utan tar bara ut olika kolumner rakt av? Om så är fallet kan subfrågan till att börja med skrivas om till:
SUBFRÅGA
SELECT DISTINCT -- <--- Tar bort dubletter
a.field5,
b.field6
FROM
tbl5 a
INNER JOIN tbl6 b
ON a.id = b.parent
WHERE
b.foo = <d.field4>
ORDER BY a.field5 ASC;
Dock kommer både din ursprungliga fråga och denna att lämna ifrån sig lika många rader som det finns unika värden på kombinationen (a.field5, b.field6) vilket BÖR vara ett värde per a.field5 eftersom den ursprungliga frågan gick att köra. (Om inte MySQL tillåter GROUP BY-uttryck som andra SQL-databaser inte tillåter, eller "b.field6" i själva verket maskerar en aggregerande funktion på kolumnen.)
För att vara säker på att du bara får ut en rad, kan du ändra uttrycket till:
SELECT DISTINCT -- <--- Tar bort dubletter
a.field5,
b.field6
FROM
tbl5 a
INNER JOIN tbl6 b
ON a.id = b.parent
WHERE
b.foo = <d.field4>
ORDER BY a.field5 ASC
LIMIT 1; -- <--- ta bara med första raden
Det här uttrycket är betydligt skonsammare för DB:n än vad ursprunget är, och tar därför inte alls lika lång tid att köra.
Sedan ger ditt inlägg ingen uppgift om var du stoppar in subfrågan i huvudfrågan idag? Eller gör du det som två separata frågor i en slinga i webbkoden?
För att kunna ge tips om hur du slår ihop det till en fråga måste jag veta hur subfrågans tabeller "sitter ihop med" huvudfrågans. Är några tabeller i de två uttrycken samma? Vilken/vilka kolumner i de respektive tabellerna joinar du på?
I ditt eget förslag på kombination, har du inte heller med någon av de krav du ställer på subfrågan vad jag kan se, vilket gör det än svårare att gissa hur tabellerna sitter ihop.
