Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Random Funktion

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von MrMahi, 18 September 2012.

  1. MrMahi

    MrMahi Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

    Habe ich nicht ganz verstanden. Du willst ein zufälliges Team 2 bis 6 Usern zuordnen?
     
  3. MrMahi

    MrMahi Benutzer

    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?
     
  4. MrMahi

    MrMahi Benutzer

    Also jeder bekommt z.B ein Team zugelost.
    Und alle müssen dann Unique sein.
     
  5. ukulele

    ukulele Datenbank-Guru

    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 gefällt das.
  6. MrMahi

    MrMahi Benutzer

    Ahhh Coool!
    Das hört sich gut an. Smarte Lösung! Danke Dir!
    Ich probier's mal aus.
     
  7. MrMahi

    MrMahi Benutzer

    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?
     
  8. ukulele

    ukulele Datenbank-Guru

    Ich kann leider kein PHP, ich sehe da aber auch noch nicht die Notwendigkeit für.

    Wie genau sehen denn die Tabellen aus?
     
  9. MrMahi

    MrMahi Benutzer

    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!
     
  10. ukulele

    ukulele Datenbank-Guru

    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?
     
  11. MrMahi

    MrMahi Benutzer

    das muss nur einmal auf dem schirm stehen.
    ist sozusagen die auslosung wer welche teams nehmen muss.
     
  12. ukulele

    ukulele Datenbank-Guru

    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().
     
    PLSQL_SQL und MrMahi gefällt das.
  13. MrMahi

    MrMahi Benutzer

    1000 Dank "Ukulele".

    Probiere ich gleich aus und sage Dir dann ob es gefunzt hat.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden