yo,
Nun wollte ich auf einer Seite die 20 beliebtesten Artikel anzeigen lassen. Dazu speichere ich in einer Tabelle "favs" die Nummern (ohne Farbe) in der Spalte "article".
alleine diese speicherung scheint mir schon eine denormalisierung zu sein. das ist grundsätzlich kein beinbruch, sollte aber bewußt geschehen. die frage ist, woran erkennt man den die "beliebtesten artikel" und ob man diese artikel noch extra persisiteren muss oder nicht schon aus den vorhanden daten herleiten kann. aber nun zu deinem problem.
ich das CASE konstrukt einsetzen, das ließt meienr meinnung nach besser als deine schreibweise, zumal ich auch SELECT und klammern in deienr abfrage für überflüssig halten. zum anderen sehe ich zwei ausführungsprobleme in deiner abfrage.
zum einen benutzt du bei der korrelation in der unterabfrage funktionen. dadruch kann ein eventuell vorhandener index nicht greifen, jendefalls nicht solange das dbms keine funktionallen indexe kennt. diese zu beheben erfordert ein wenig mehr wissen über die beiden tabellen fav und article und wie die beiden tabellen genau miteinander verbunden sind. wäre gut, wenn du dazu noch ein paar infos geben könntest.
zum anderen erscheint es mir, als wenn erst mal alle datensätze von fav genommen werden udn darauf eben immer korrelierte unterabfragen ausgeführt werden und dann erst die anzahl auf 20 begrentzt wird. das liegt an der tatsache, dass er erst einmal die ergebnisse alle ergebnisse der tabelle fav haben will, um sie dann zu sortieren und die 20 ersten entsprechend auszuwählen. um dieses zu testen könntest du nur mal testweise das ORDER BY weglassen udn nur das LIMIT verwenden. sollte dies wirklich ein problem sein, kannst du zuerst in der FROM klausel eine unterabfrage einbauen, die dir zuerst die 20 datensätze aus der tabelle fav liefert, ohne die korrleirerte unterabfrage auszuführen und dann erst später im äußen SELECT diese wieder hinzugefügt wird.
Ilja