ThomasLa: MySQL: Was bewirkt eine Unterabfrage in der ORDER BY Klausel?

Beitrag lesen

Sakrament, das funktionert ja wirklich :-) - DANKE!!

Hier mal ein kleines Beispiel zur Illustration:

  
 CREATE TABLE `produkte` ( `id` tinyint(4) NOT NULL );  
 INSERT INTO `produkte` VALUES (1);  
 INSERT INTO `produkte` VALUES (2);  
 INSERT INTO `produkte` VALUES (3);  
  
 CREATE TABLE `bewertungen` ( `produkt` tinyint(4) NOT NULL,  
  `bewertung` tinyint(4) NOT NULL);  
 INSERT INTO `bewertungen` VALUES (1, 1);  
 INSERT INTO `bewertungen` VALUES (1, 2);  
 INSERT INTO `bewertungen` VALUES (2, 1);  
 INSERT INTO `bewertungen` VALUES (2, 2);  
 INSERT INTO `bewertungen` VALUES (2, 1);  

Dann erzeugt die Abfrage

  
 SELECT * FROM produkte ORDER BY (SELECT COUNT(*) FROM bewertungen WHERE produkte.id=bewertungen.produkt) DESC;  

das Resultat:
+----+
| id |
+----+
|  2 | <= Produkt Nr. 2 hat die meisten Bewertungen
|  1 |
|  3 |
+----+

So wie ich das jetzt verstehe, sind diese drei Bedingungen erforderlich:
*) Die Unterabfrage darf nur eine einzige Spalte enthalten. Sonst kommt die Fehlermeldung "Operand should contain 1 column(s)".
*) Die Unterabfrage darf nur eine einzige Zeile zurückliefern. Sonst kommt die Fehlermeldung "Subquery returns more than 1 row".
*) Die Unterabfrage muss eine WHERE-Klausel enthalten, über die eine Art temporäre Beziehung zwischen den korrespondierenden Feldern hergestellt wird. Sonst weiß "er" ja nicht, welchem Produkt er welchen COUNT-Wert zuordnen soll.

Stimmt das so?

Gibt's auch die Möglichkeit, dass ich die Sortierreihenfolge selber durch eine Art Liste (d.h. Unterabfrage) festlege? Also im obigen Beispiel sowas wie:

  
 SELECT * FROM bewertungen ORDER BY produkt (3,1,2)