Random ID aus SQL Datenbank lesen

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hey Leute


    Ich habe da mal eine Frage und zwar möchte ich einen /work Befehl machen der random eine ID aus der Datenbank herausnimmt, nun wollte ich eigentlich nur noch einmal eine Bestätigung ob meine Vorstellung wie ich es machen möchte so schon richtig ist oder ob ich da etwas vergessen habe oder etwas komplett falsches mache.


    Hier einmal wie ich mir es gedacht habe:


    CMD:work(playerid,params[])
    {
    new str[128],DBResult:Result
    new RandomMission = random(100); //Wird noch bei mir angepasst, ist jetzt nur um ein beispiel zu erschaffen
    if(pInfo[playerid][IsInMission]==0)
    {
    format(str,sizeof(str),"SELECT `ID`FROM`PizzaMissionStart`WHERE`ID`='%d'",RandomMission)
    Result=db_query(database,str);
    if(db_num_rows(Result)>0)
    {
    db_get_field_assoc(Result,"Name",str,sizeof(str));
    pInfo[playerid][StartName]=str;
    db_get_field_assoc(Result,"X",str,sizeof(str));
    pInfo[playerid][StartX]=floatstr(str);
    db_get_field_assoc(Result,"Y",str,sizeof(str));
    pInfo[playerid][StartY]=floatstr(str);
    db_get_field_assoc(Result,"Z",str,sizeof(str));
    pInfo[playerid][StartZ]=floatstr(str);
    CreateDynamicCP(pInfo[playerid][StartX],pInfo[playerid][StartY],pInfo[playerid][StartZ],5,-1,-1,playerid,100);
    pInfo[playerid][IsInMission]=1;
    new str2[128],DBResult:ResultEnd;
    format(str,sizeof(str),"SELECT `ID`FROM`PizzaMissionEnd`WHERE`ID`='%d'",RandomMission)
    ResultEnd=db_query(database,str);
    if(db_num_rows(ResultEnd)>0)
    {
    //Wird dann wieder benutzt wenn er im ersten/start Checkpoint ist
    db_get_field_assoc(Result,"Name",str,sizeof(str));
    pInfo[playerid][EndName]=str;
    db_get_field_assoc(Result,"X",str,sizeof(str));
    pInfo[playerid][EndX]=floatstr(str);
    db_get_field_assoc(Result,"Y",str,sizeof(str));
    pInfo[playerid][EndY]=floatstr(str);
    db_get_field_assoc(Result,"Z",str,sizeof(str));
    pInfo[playerid][EndZ]=floatstr(str);
    }
    else
    {
    //Hier hänge ich derzeitig noch etwas fest. Siehe letzter Satz ausserhalb des Codes.
    }
    }
    else
    {
    return cmd_work(playerid,params);
    }
    }
    else
    {
    SendClientMessage(playerid,red,"You can't start 2 missions at once. Type /cancel to stop the current mission!");
    }
    return 1;
    }


    Zudem bleibt bei mir noch jetzt die Frage, wie mache ich es nun wenn ResultEnd nicht >0 ist, damit er dann noch einen durchlauf startet?

  • statt
    SELECT `ID`


    SELECT *



    Danke schon einmal für den Hinweis BlackAce, jedoch habe ich dann trotzdem das Problem, dass wenn bei ResultEnd sollte die random ID nicht existieren ich keinen weiteren Durchlauf derzeitig hinbekomme. Was ja nun sehr störend ist, da eine Mission einen Start- und Endpunkt braucht und ich nicht nochmals den kompletten Befehl returnen möchte, sondern nur den Query für ResultEnd.

  • Du kannst, um sicherzugehn, dass die ID existiert auch einfach die MYSQL Random sortieren und nur ein Ergebnis ausgeben lassen.


    SQL
    SELECT * FROM `table` ORDER BY RAND() LIMIT 1;


    Nur Blöd wenn SQLite das nicht unterstützt :D


    SQL
    SELECT * FROM `PizzaMissionEnd`
      WHERE id >= (abs(random()) % (SELECT max(id) FROM PizzaMissionEnd))
      LIMIT 1;


    Das sollte eigentlich gehen ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • SQL
    SELECT * FROM `PizzaMissionEnd`
      WHERE id >= (abs(random()) % (SELECT max(id) FROM PizzaMissionEnd))
      LIMIT 1;


    Das sollte eigentlich gehen ;)


    Werde mal testen und Bericht erstatten sobald ich alles soweit habe, da ich dann auch ersteinmal schön Start und Endpunkte InGame erstellen darf und noch ein paar Abfragen in meinen /work Befehl einbauen darf, da dass da oben zwar schon mit meinen Variablen etc ist, jedoch noch nicht abfragt zum Beispiel was es für Fahrzeug ist. ;3 Aber das ist das kleinere Übel.


    EDIT: BTW BlackAce könntest du mir einmal bitte erklären wieso den format so oder einmal bitte eine Referenzseite schicken, da ich schon gerne wissen würde was ich da überhaupt scripte. ^^

    Einmal editiert, zuletzt von ulbi1990 ()