mmofacts.com

[MySQL] kleiner Query

gepostet vor 17 Jahre, 4 Monate von 0ldM4n
Hi,
hänge im Moment an einem kleinem Query. Und zwar soll ein er unter "space" einen Eintrag hinzufügen wo per Zufall x und Y bestimmt wird. Jedoch darf X und Y nicht bereits unter dem Table "planeten" vergeben sein.
Wüsst ihr wie das gehen könnte?
Christian
gepostet vor 17 Jahre, 4 Monate von Fornax
mir fällt jetzt nur ne lösung mit mehreren queries ein:
$insert = false;
whlie(!$insert)
$x = zufall();
$y = zufall();
sql -> select count(*) from space where x=$x and y=$y
if(rows==0){
$insert = true;
}
}
sql -> insert into space (x, y) values ($x, $y)
Mehr fällt mir auch grad nicht ein, evtl stehe ich ein bisschen auf dem schlauch da ich erst seit ~45 minuten wach bin...
gepostet vor 17 Jahre, 4 Monate von 0ldM4n
So kann es doch sein, dass er Stundenlang probiert bis er mal einen gefunden hat, der nicht existiert. :-/ Kann man das ganze nicht in einen Query machen?
gepostet vor 17 Jahre, 4 Monate von Itchy
Nicht elegante Lösung, aber möglich, wenn x und y nicht allzu sehr ausufern (z.B. Werte von 1-1000):
Du legst eine Tabelle "alle_werte" an mit den Spalten x und y und füllst die mit allen gültigen Werten. Im Falle von einem Wertebereich von 1 bis 1000 haste dann 1.000.000 Zeilen drin.
Dann kannst Du einen SELECT machen wie folgt:
SELECT x,y FROM alle_werte WHERE (x,y) NOT IN (SELECT x,y FROM space) ORDER BY RAND()

WIe gesagt, keine elegante Lösung, ich schau mir das später nochmal an, aber jetzt muß ich den Grill anwerfen
gepostet vor 17 Jahre, 4 Monate von ThaDafinser
oder du machst den insert ganz normal mit den werten die du bekommst.
das x und y feld muss halt unique sein.
dann prüfst du, ob du eine fehlermeldung hast --> wenn ja neue werte
sonst ist's ok
gepostet vor 17 Jahre, 4 Monate von AngelFilia
Ich würd da die Tabelle mit den gültigen Werten als referenz-tabelle anlegen und dort alle Werte löschen, die in der anderen drin sind.
Sobald du dann in der anderen was hinzufügst in der einen löschen und umgekehrt - dann kannst du nämlich aus der referenz-tabelle dein zufälliges x und y bestimmten in dem du
SELECT x,y FROM reference_table ORDER BY RAND() LIMIT 1;
als Query nimmst.
Eine bessere methode fällt mir da nicht ein.
gepostet vor 17 Jahre, 4 Monate von Kampfhoernchen
Ist sicherlich die sauberste.
Kommt natürlich auch drauf an, wie groß x und y sind und wie starkt sie besetzt werden sollen.
gepostet vor 17 Jahre, 3 Monate von 0ldM4n
@ AngelFilia
Wenn ich das so machen werde wie du sagst, hat die Datenbank aber sehr zu schaffen denn:
Ich fliegen mit meinen Schiff auf die Position 5:5 . SQL prüft ob frei ist. Okay ist frei, also unter dem Table löschen. Ich fliege weiter auf Position 5.6 . SQL prüft ist frei, ja ist frei. Also lösche wieder einen Eintrag, aber vorher war er auf einem freien Feld, also füge das vorige wieder hinzu(5:5).
Kenn mich nicht so mit der Performance aus, aber das hört sich doch viel an?
gepostet vor 17 Jahre, 3 Monate von None
Hört sich für mich eher nach einer Aufgabe an, welche über einen Service/Daemon gelöst werden könnte, welche die Daten vorhält und somit die Datenbankzugriffe minimiert.
gepostet vor 17 Jahre, 3 Monate von Amun Ra
Ich versteh dich nicht ganz.
Willst du nun eine Karte oder sowas füllen
und ein Feld nicht doppelt mit einem Objekt belegen.
Oder willst einfach über deine Karte fliegen
und wissen ob das Feld besetzt ist ?
gepostet vor 17 Jahre, 3 Monate von HSINC
klingt eher für mich nach einer notwendigen überarbeitung der db struktur
gepostet vor 17 Jahre, 3 Monate von Itchy
Ich denke, der OP hat eine 2D Karte mit x mal y Feldern und in jedem Feld kann ein System sein. Wenn ein neuer Spieler dazukommt, benötigt dieser ein Heimatsystem und ergo ein Feld dieser x mal y Matrix.
gepostet vor 17 Jahre, 3 Monate von DrakeL
Wenn es so ist, dass er einfach nur ein freies Feld aus dieser x, y Struktur braucht ist die Lösung von AngelFilia am sichersten und saubersten.
Man könnte es auch so machen wie weiter oben beschrieben und einfach mit inserts und neuen Zufallszahlen probieren bis man ein freies System gefunden hat, Problem ist, es kann hier beim ersten oder beim 100 Statement funktionieren.
gepostet vor 17 Jahre, 3 Monate von Kapsonfire
ich hab bei meinem browsergame 1000*1000 felder
diese sind eingebaut festgelegt
und dann sucht er ein feld raus welches nciht belegt ist mit WHERE bewohnt='nein' order by RAND()

Auf diese Diskussion antworten