Dennis B.: MySQL: Order By mit Subquery

Hallo,

ich habe folgendes Problem:

In meiner Datenbank stehen Artikel (db_articles). Die Tabelle db_articles sieht so aus:

id | Titel | fixedrating
1  | Prod. | 1
2  | P 2   | 0

in einer weiteren Tabelle (db_articles_ratings) sind Produktberwertungen der user gespeichert:

user_id | product_id | rating

Wenn ich nun das Benutzerrating zu einem Produkt haben will, lautet meine Abfrage ganz einfach:

SELECT AVG(rating) FROM db_articles_ratinge WHERE product_id=1.

Das geht auch soweit.

Nun soll es aber die Möglichkeit geben, einem Produkt eine feste und nicht veränderbare Bewertung durch den Administrator zukommen zu lassen. Diese wird dann in dem Artikel in "fixedrating" gespeichert.

Ist fixedrating gleich 0, wird die user-Bewertung zu Rate gezogen, sonst eben die fixed-Rating-Bewertung.

Soweit so gut, die Applikation leistet das aber auch. Nun möchte ich jedoch eine Produktliste von SQL holen, sortiert nach der Bewertung.

SELECT id FROM db_articles
ORDER BY fixedrating DESC, (
  SELECT AVG(rating) FROM db_articles WHERE product_id=id
) DESC

Das geht auch soweit. Nur, wenn ich weitere Felder der Order-by-Klausel hinzufüge, sortiert er natürlich nach fixedrating aufsteigend, d.h. alle Produkte ohne fixedrating erscheinen oben.

Ich muss also der Datenbank sozusagen die Logik beibringen:

wenn fixedrating > 0 dann sortiere nach fixed rating,
sonst sortierte nach select avg(....

Any hints?

Danke
D.

  1. Hallo,

    Nun soll es aber die Möglichkeit geben, einem Produkt eine feste und nicht veränderbare Bewertung durch den Administrator zukommen zu lassen. Diese wird dann in dem Artikel in "fixedrating" gespeichert.

    Ist fixedrating gleich 0, wird die user-Bewertung zu Rate gezogen, sonst eben die fixed-Rating-Bewertung.

    das sollte man besser machen. Für genau solche Fälle gibt es den NULL-Wert. Der ist viel besser als eine 0.

    Any hints?

    NULL in Kombination mit COALESCE.

    Freundliche Grüße

    Vinzenz

    1. yo,

      das sollte man besser machen. Für genau solche Fälle gibt es den NULL-Wert. Der ist viel besser als eine 0.

      das sehe ich zwiegespalten, zum einen wird es oft mit einem NULL wert praktiziert. zum anderen bedeutet NULL, "unbekannt, keine information vorhanden". hier hat er aber eine information. deswegen würde ich die 0 stehen lasses und es mit CASE abfangen.

      Ilja

      1. das sollte man besser machen. Für genau solche Fälle gibt es den NULL-Wert. Der ist viel besser als eine 0.

        das sehe ich zwiegespalten, zum einen wird es oft mit einem NULL wert praktiziert. zum anderen bedeutet NULL, "unbekannt, keine information vorhanden". hier hat er aber eine information. deswegen würde ich die 0 stehen lasses und es mit CASE abfangen.

        Danke. Ich habe es mit dem NULL-Wert gemacht. "keine Information" einfach gedeutet als "keine Fix-Bewertung". ;-)

        D.

  2. Hi,

    Nun soll es aber die Möglichkeit geben, einem Produkt eine feste und nicht veränderbare Bewertung durch den Administrator zukommen zu lassen.

    Interessantes Konzept. Fuer diese "Fixbewertungen" laesst du dich dann vom Produkthersteller bezahlen, oder wie darf man sich das vorstellen ...?

    MfG ChrisB