Zufällige Reihenfolge + "Distinct"

port29

deus.Server
Hallo Leute,

ich stehe gerade etwas auf dem Schlauch und benötige Hilfe bei einem MySQL Query. Es geht darum, dass in einer Datenbank Werbebanner gespeichert sind. Diese Banner sollen dann in zufälliger Reihenfolge auf der Website angezeigt werden. Eine Zusatzbedingung ist, dass von einem Benutzer nur ein Banner angezeigt werden darf.

Code:
select business_user_id, id, weiterleitung_art, weiterleitung_id, upload_id from werbung where state='online' group by business_user_id  order by RAND() limit 0,2

Dieses Query macht schon in etwa das, was ich möchte, allerdings gibt es ein Problem. Hat ein Benutzer gleichzeitig zwei Banner gebucht, so kommt wegen des "group by business_user_id" immer ein (der gleiche) Banner raus, bevor dann letztendlich per RAND() sortiert wird.

Wie kann ich mein Problem da lösen?
 
Hi,

na ja, es ergibt eigentlich keinen Sinn, Felder auszuwählen, nach denen nicht gruppiert und über die auch nicht aggregiert wird. Die Sortierung betrifft ja nur das Gesamtergebnis, welche Werte sollten also gewählt werden, wenn es mehrere gibt. MySQL ist da tolerant, andere DBMS würden Dir die Abfrage um die Ohren hauen. Tatsächlich wurde dieses "Feature" soviel ich weiß eingebaut, für den Fall, dass die Werte einer Spalte innerhalb einer Gruppe alle gleich sind (z.B. nützlich bei JOINS, dann muss man nicht nach 10 Spalten gruppieren). Sind die Werte nicht alle gleich, nimmt MySQL wohl den erstbesten.

Folgendes ist zwar aus genannten Gründen dreckig, sollte mit MySQL aber funktionieren:

SQL:
SELECT t1.business_user_id, id, weiterleitung_art, weiterleitung_id, upload_id 
   from (
      select distinct business_user_id 
         from werbung
   ) t1, 
   (
      SELECT business_user_id, id, weiterleitung_art, weiterleitung_id, upload_id 
         FROM werbung 
         order by RAND()
   ) t2 
   WHERE t1.business_user_id = t2.business_user_id
   group by t1.business_user_id

Es wäre übrigens hilfreich, wenn Du eine SQL-Abfrage nicht in eine Zeile klatschst, sondern in SQL-Tags packst und strukturierst, dann ist das besser lesbar.

LG
 
Zurück