Random Funktion

MrMahi

Benutzer
Beiträge
22
Hallo,

folgendes Problem:

Ich möchte aus einer Datenbank die Teamnamen (Fussball) randomizierd ausgeben und N-Usern (2 - 6) zuteilen. Dabei dürfen die Teamnamen keine Dopplungen ergeben.

Wenn ich das so mache:
SELECT teamname
FROM teams
WHERE stars = 5
ORDER BY RAND()
LIMIT 1

kann ich ja die Schleife nicht mehr weiterreichen,
da die ja dann leer ist.
Aber ich möchte ja nur jeweils einen Teamnamen ausgeben.
Wenn ich aber für jeden Usern ne eigene Abfrage mache dann könnte ich dopplungen drin haben.
Da hackst bei mir nen bißchen.

Jemand ne Idee?
Ist das Problem halbwegs ok beschrieben?
Besten Dank,
Jens
 
Werbung:

MrMahi

Benutzer
Beiträge
22
Ne , ich habe ne Liste mit mehreren Teams (ca 50).
Die möchte ich auf die User (2 - 6) verteilen ohne das es ne Dopplung gibt.

So besser?
 

ukulele

Datenbank-Guru
Beiträge
4.394
Du müsstest eigentlich nur deine Auswahl einschränken auf die Teams, die noch nicht zugeteilt wurden. Etwa so:
SELECT teamname
FROM teams
WHERE stars = 5
AND teamname NOT IN ( SELECT teamname FROM z_teams_user )
ORDER BY RAND()
LIMIT 1

Jedes mal wenn du ein Team einem User zugeordnet hast (in der Zuordnungstabelle) müsste deine Auswahl kleiner werden.
 

MrMahi

Benutzer
Beiträge
22
Puhhh irgendwie komme ich damit nicht zurecht.
Ich habe Probleme die Ausgabe zu erledigen und die Variable in die WHERE NOT Bedingung zu kloppen.
Gibt es nicht was per PHP in Verbindung mit der SQL Abfrage?

Noch ne Idee jemand?
 

ukulele

Datenbank-Guru
Beiträge
4.394
Ich kann leider kein PHP, ich sehe da aber auch noch nicht die Notwendigkeit für.

Wie genau sehen denn die Tabellen aus?
 

MrMahi

Benutzer
Beiträge
22
hier mal ein bsp (schlimmer code ;( ):

/* TEAMNAME 5-1 */

$teamname_5_1 =
"
SELECT teamname
FROM teams
WHERE stars = '".$wertung5_1."'
ORDER BY RAND()
LIMIT 1
";

$db_erg_teamname_5_1 = mysql_query( $teamname_5_1 );
if ( ! $db_erg_teamname_5_1 )
{
die('Ungültige Abfrage: ' . mysql_error());
}


echo "<tr><td>" . $name1 . "</td><td>";
while ($zeile_teamname_1_1 = mysql_fetch_array($db_erg_teamname_1_1, MYSQL_ASSOC))
{
echo $zeile_teamname_1_1['teamname'];
}
echo "</td><td>";
while ($zeile_teamname_1_2 = mysql_fetch_array($db_erg_teamname_1_2, MYSQL_ASSOC))
{
echo $zeile_teamname_1_2['teamname'];
}
echo "</td><td>";
while ($zeile_teamname_1_3 = mysql_fetch_array($db_erg_teamname_1_3, MYSQL_ASSOC))
{
echo $zeile_teamname_1_3['teamname'];
}
echo "</td></tr>";


Ich glaube das ganze Konstrukt ist momentan noch viel zu Umständlich!
Mal schauen was Du sagst!
 

ukulele

Datenbank-Guru
Beiträge
4.394
Du willst doch sowas wie Paarungen bilden. Die müssen doch auch in irgendeiner Tabelle gespeichert werden oder soll das ganze nach jedem Aufruf wieder verschwunden sein?
 

ukulele

Datenbank-Guru
Beiträge
4.394
Also ich kann dir das als ein SELECT anbieten der aus allen auswählbaren Teams (in deinem Beispiel gilt ja noch die Bedingung stars=5) fünf ausgibt und mit 5 beliebigen Usern zusammen als eine Tabelle ausspuckt.

Wenn du jede Zeile einzeln ausgeben willst, muss deine Abfrage irgendwie erfahren, was in der Abfrage zuvor ausgegeben wurde. Du musst das also entweder in Variablen in PHP oder in einer Zuordnungstabelle in SQL festhalten. Anders kann es nicht funktionieren. Daher habe ich erstmal alles in einem mehrzeiligen SELECT ausgegeben. Der wird bei jedem Aufruf ein anderes Ergebnis liefern.

Code:
SELECT    *
FROM    (    SELECT    rank() OVER (ORDER BY newid()) AS zeile,
                    teamname
            FROM    teams
            WHERE    stars = 5
            LIMIT 5 ) t1,
        (    SELECT    rank() OVER (ORDER BY newid()) AS zeile,
                    username
            FROM    usertabelle
            LIMIT 5    ) t2
WHERE    t1.zeile = t2.zeile
Natürlich gibt es ein paar Schwierigkeiten zu beachten:

1) Ich habs in MS SQL zusammen gebastelt. Wir haben hier aber mehrere Unterschiede zwischen MySQL und MS SQL.
a) Ich weiss nicht, ob rank() OVER ORDER BY in MySQL geht. Eigentlich muss nur die Zeilennummer mit ausgegeben werden, die dann als eigene Spalte mit dem Spaltenalias "zeile" an die Tabelle angehängt wird.
b) Ich nutze newid() als Funktion. In MySQL gibt es glaube ich uid() als Funktion, die das selbe macht.
c) LIMIT gibt es wiederrum in MS SQL nicht, das ist aber eher mein Problem :)
2) Die Funktion ORDER BY rand() sollte eigentlich in keinem der beiden SQL Versionen eine zufällige Sortierung zustande bringen, daher verwende ich sozusagen ORDER BY newid().
 
Werbung:
Oben