Priorität bei mysql Abfrage

TribunM

Erfahrenes Mitglied
Hallo Datenbankfreunde,

ich habe folgendes vor und wollte mal in die Runde fragen, ob einer von euch schon etwas ähnliches gemacht hat oder einen Ansatz hat.

Folgedendes:

Ich habe eine kleine "Auktions"seite die ich momentan etwas umbaue. Ich möchte auf der Startseite rotierend Artikel anzeigen. Klappt auch alles. Jetzt gibt es unterschiedliche Benutzerstati. So etwas ähnliches wie hier auf tutorials.de aktive Member haben einen besseren Status.

Jetzt bin ich gerade am überlegen wie ich Artikel dieser Member bei der Auswahl der Artikel auf der Startseite bevorzugen kann. Wichtig ist, dass eben nicht nur die Artikel der Leute mit "besseren" Status angezeigt werden, sondern bei der Auswahl bevorzugt werden.

Gibt es da eine mysql Funktion oder muss ich da etwas in Verbindung mit PHP erst basteln?

Freue mich auf eure Ideen und Denkansätze
 
Du musst schon genauer spezifizieren, was "bevorzugen" heißen soll. Und wie sieht deine Abfrage im Moment aus? Werden die Artikel zufällig gewählt?
 
Angenommen du willst 15 verschiedene Artikel anzeigen und davon sollen 10 von bevorzugten Membern (Kennzeichen = 1) sein und 5 sollen von "normalen" Membern (Kennzeichen = 0) sein:

SQL:
(SELECT feld1, feld2, feld3 FROM tabelle WHERE member = 1 ORDER BY RAND() LIMIT 10) UNION (SELECT feld1, feld2, feld3 FROM tabelle WHERE member = 0 ORDER BY RAND() LIMIT 5)

Damit solltest du das gewünschte Ergebnis kriegen!?
 
Hi tombe. So etwas ähnliches habe ich schon ausprobiert.

Aber zwei Probleme entstehen da. Erstens wenn es knapp über zehn Artikel der "besseren" user sind, werden immer die gleichen angezeigt (selbst wenn 50 der anderen user existieren) und wenn es weniger als zehn Artikel dieser Usergruppe sind, müsste das ganze sozusagen mit Artikeln der anderen Usern aufgefüllt werden.

Es sollte also dynamisch sein und nicht statisch. Klar man könnte vorher per if abfragen, wie viele Artikel von den "besseren" usern vorhanden sind und dann dementsprechend die jeweilige Abfrage mit Übergabe der Parameter starten. Das wäre dann wiederum "halb" statisch.

Hm für eine andere Sache habe ich eine Zufallszahl errechnet und den jeweiligen Bereich könnte man einem Nutzerstatus zuordnen. Dann müsste ich 15 Zufallszahlen errechnen und dann jeweils die Abfrage starten. Daraus bastel ich dann einen Array.

Aber das ist schon sehr umständlich und nicht wirklich performant glaube ich?
 
Was das dynamische "Auffüllen" angeht:

SQL:
(SELECT feld1, feld2, feld3 FROM tabelle WHERE member = 1 ORDER BY RAND() LIMIT 10) UNION (SELECT feld1, feld2, feld3 FROM tabelle WHERE member = 0 ORDER BY RAND()) LIMIT 15

Bei der zweiten Abfrage das LIMIT rausgenommen und dafür ein LIMIT für die gesamte Abfrage vergeben.
Wenn jetzt die erste Abfrage keine 10 Datensätze liefert, wird die Gesamtzahl 15 mit den Datensätzen der zweiten Abfrage gefüllt.


Was das erste Problem angeht, da wird es wohl schwierig eine Lösung zu finden. Wenn es nunmal nur 10, 11, 12 dieser User gibt ist es ja klar das hier fast immer die gleichen angezeigt werden.

Dann müsstest du wirklich in einer vorherigen Abfrage die Anzahl ermitteln und die Verteilung entsprechend anpassen.
 
ja hast Recht ich mache doch eine Vorabfrage und übermittle das neue Limit an die zweite Abfrage. Ich hänge dann das zweite Ergebnis an das erste und habe so meinen Array. hm...

Ach wußte gar nicht, dass man das mit den Limits so machen kann. Für die Priorisierung hatte ich mir so etwas ausgedacht:

Code:
SELECT title, user_id, FLOOR(20 + (RAND() * 11)) as nr
          FROM topitems
         WHERE user_id NOT IN (SELECT user_id FROM bestuser)
UNION (SELECT title, user_id, FLOOR(1 + (RAND() * 30)) 
          FROM topitems
         WHERE user_id IN (SELECT user_id FROM bestuser))
ORDER by nr DESC

Da die Wahrscheinlichkeit für eine größere Zahl bei den "bestusern" dreimal höher ist, werden die Artikel dieser user dementsprechend häufiger oben angezeigt. Das kann man natürlich noch anpassen indem man den Zahlenrahmen erweitert.

Ist nicht die beste Variante aber fusioniert soweit ;).

Für weitere Verbessserungen bin ich natürlich offen.

@Tombe
Mir ist gerade aufgefallen, als ich noch etwas testen wollte, dass wenn ich deinen Code nutze, er die Daten nur nach Random sortiert, wenn ich im zweiten SELECT auch ein Limit setze. Komisch...
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück