2017-08-12 1 views
0

ich in meiner DB nächste Tabelle habe:MySQL Wie smth von MAX wählen (id) .... WHERE userID = eine Zahl GROUP BY smth

personal_prizes

___________ ___________ _________ __________ 
| id  | userId | specId| grp | 
|___________|___________|_________|__________| 
| 1  | 1  | 1  |  1 | 
| 2  | 1  | 2  |  1 | 
| 3  | 2  | 3  |  1 | 
|  4  | 2  | 4  |  2 | 
|  5  | 1  | 5  |  2 | 
|  6  | 1  | 6  |  2 | 
| 7  | 2  | 7  |  3 | 
|  8  | 1  | 13 |  4 | 
|___________|___________|_________|__________| 

I specId auswählen muß von max id group von grp. So habe ich komponiert nächste Abfrage

SELECT pp.specId 
FROM personal_prizes pp 
WHERE pp.specId IN (SELECT MAX(pp1.id) 
        FROM personal_prizes pp1 
        WHERE pp1.userId = 1 
        GROUP BY pp1.grp) 

Und es ist Arbeit für meinen kleinen Tisch. Aber wenn ich versuche, es für meine prod db mit personal_prices> 100.000 zu implementieren. Bitte helfen Sie mir, es zu optimieren

+0

Wir könnten versuchen, Ihre Abfrage neu zu schreiben, aber mit nur 100K Datensätze ist die Leistung wirklich ein Problem für Sie? –

+0

Oh ... Gibt es noch ein anderes Problem? –

+0

Es gibt kein Problem. – trincot

Antwort

0

Die Abfrage, die Sie haben, sollte gut funktionieren. Stellen Sie jedoch sicher, dass Sie nicht nur einen Index für id haben (was ich für den Primärschlüssel halte), sondern auch einen für specId.

nur als Alternative, können Sie dieses versuchen:

select group_concat(pp.specId order by pp1.id desc)+0 as result_specId 
from  personal_prizes pp1 
left join personal_prizes pp on pp.specId = pp1.id 
where  pp1.userId = 1 
group by pp1.grp 
having result_specId is not null; 

Die Idee dabei ist, dass die Sub-Abfrage auf der Hauptabfrage gefördert wird und die specId von einem äußeren abgerufen beizutreten. Die group_concat Aggregationsfunktion listet die von Interesse als erste auf. Die having-Klausel schließt die Fälle aus, in denen keine übereinstimmende specId gefunden wurde.

Beachten Sie, dass dies nur dann zu den gleichen Ergebnissen führt, wenn das Feld specId garantiert nicht null ist.

+0

Oh, Ihre alternative Abfrage funktioniert! Vielen Dank! Aber es dauert 6,5 Sekunden (((Können Sie mir helfen, diese Zeit mit einer anderen Abfrage zu reduzieren?) –

+0

Sie können bessere Ausführungszeit bekommen, wenn Sie einen Index auf 'specId' haben. Haben Sie das? – trincot

+0

Ja, die specId hat index ... –