2011-01-16 4 views

Antwort

2

Sie einen „gewichteten Zufalls verwenden könnte B.:

SELECT title, body FROM posts ORDER BY (score+1) * RAND() DESC LIMIT 5 

Die + 1 ermöglicht es, Beiträge mit 0 Punkten auszuwählen. Abhängig von der durchschnittlichen Punktzahl Ihrer Post müssen Sie möglicherweise die Punktzahl mit einem anderen konstanten Faktor (z. B. 0.5*score+1) multiplizieren.

Abhängig von der Verteilung Ihrer Punktzahlen können Sie Ihre Punktzahl umwandeln, zum Beispiel mit LOG(score) oder SQRT(score).

+0

Wie skaliert diese Methode im Hinblick darauf, wann die Datenbank ziemlich groß wird: z.B. 10k + Anzahl der Beiträge? (Nicht dass es so viele gibt, aber Skalierbarkeit ist das Problem) Wird sich die Verwendung von Lucene als eine bessere Methode erweisen? – whamsicore

+0

Ich habe Lucene nie benutzt, also kann ich dir nicht helfen. Es ist jedoch wahr, dass "RAND" mit großen Datensätzen langsam wird. Weitere Informationen zu möglichen Problemumgehungen finden Sie unter http://forums.mysql.com/read.php?24,163940,163940#msg-163940. – nico

+0

Was würde mit "0.5" multiplizieren erreichen? – lonesomeday

0

SQL-Befehl:

SELECT * FROM posts WHERE id = '$randomly_generated_ids' ORDER BY ratings ASC 

für $ randomly_generated_ids Beispiel kann "13,10,5,20"

Details sein: ORDER BY

+2

Sie wählen zufällig und dann nach Bewertung. Er möchte nach dem Zufallsprinzip Beiträge auswählen, die hohe Bewertungen in der Auswahl bevorzugen. Hier ist ein kleiner Unterschied. – Vache

3

Eine einfache Lösung wäre, Anrufe zu RAND() und auf die rating Säule aufzunehmen und sie miteinander multipliziert:

SELECT title, content FROM blog_posts ORDER BY (rating + 1) * RAND() DESC LIMIT 1; 

Wenn Sie dies gab zu viel Vortritt Produkte mit einem hohen Rating gefunden, könnten Sie SQRT verwenden :

SELECT title, content FROM blog_posts ORDER BY SQRT(rating + 1) * RAND() DESC LIMIT 1; 
+0

Wie ich in meiner Antwort gesagt habe, benötigen Sie eine +1 für "Bewertung", wenn Sie Beiträge mit 0 Punkten auswählen möchten. – nico

+0

@nico Es ist ein guter Punkt; Antwort aktualisiert – lonesomeday

Verwandte Themen