[MySQL] Query *gelöst*

@ theHacker

Was hast du damit gemeint? Und wie wird dann per Zufall ein x und y genommen? So wie ich es bei dir sehe, versucht der so lange, bis es klappt? Kann der nicht sofort im Query gucken was noch frei ist und davon einen per Zufall wählen?

X und Y kann ich nicht zum UNIQUE machen, da es 2 Felder sind. Es gibt ja Einräge mit:

X=0 Y=1 Typ=5
X=0 Y=7 Typ=2
.
.
.
X=0 Y=1800 Typ=1
.
.
.
X=1800 Y=1800 Typ=9

doch du Kannst x UND y UNIQUE machen, weil zB
x=0 y=1
nicht 2mal gleichzeitig vorkommen kann
also Primary Key (x, y)
 
Ahh, cool :) Ich habs mal über PHPMyAdmin gemacht. Habs auch schon ausprobiert:

#1062 - Duplicate entry '0-32' for key 2

Also es geht einwandfrei ;) Ich danke euch.

Nur, gib es nun eine Abfrage die anzeigt, was NICHT in der Datenbank existiert? Also die sagt: X56 & Y23 ist noch frei, oder so? Obwohl der Eintrag nicht existiert? Oder müsste ich das so machen wie Claudi und theHacker beschrieben haben? Wäre es vieleicht sogar sinnvoller das ganze Table voll mit einträgen zu machen, also auch die leeren? Dann könnte mir SQL einen per Zufall einfach geben.
 
Nee, ich glaube nicht, dass es ein Abfrage gibt, die dir was ausgibt, was nicht da ist ;)
Aber die Idee mit dem ausfüllen mit freien Feldern und dann ein zufälliges abrufen ist nicht schlecht. Allerdings haste ja dann 1mio Zeilen, in denen gesucht wird, teste halt mal aus, ob das schnell genug geht.

Alternativ kannste ja auch noch meine Variante mit den belegten im Array ausprobiern, so lahm sollte dich auch nich sein.
 
Zuletzt bearbeitet:
So, bin nun soweit mit den Test's!

Habe festgestellt mein Befehl dauert zu lange:

"SELECT x,y FROM world2 WHERE pic=0 ORDER BY RAND() LIMIT 1"
Zeige Datensätze 0 - 0 (1 insgesamt, die Abfrage dauerte 1.6906 sek.)
Ausführungsdauer: 1.79910302162 Sekunden



RAND() macht wohl Probleme, mal ohne:

"SELECT x, y FROM world2 WHERE pic=0 LIMIT 1"
Zeige Datensätze 0 - 0 (1 insgesamt, die Abfrage dauerte 0.0006 sek.)
Ausführungsdauer: 0.000905990600586 Sekunden



Nun der Test mit dem Array:

Ausführungsdauer: 0.0130751132965 Sekunden
:) Aber es ist zufällig. Das heißt, er ist WINNER :D



EDIT:
Den Array Code habe ich mal umgebaut und 1000 mal durchrattern gelassen, er braucht nun im Schnitt:
Ausführungsdauer: 0.00716389107704 Sekunden

PHP:
$planeten = array();
$stmt = $db->QueryResult("SELECT x, y FROM world WHERE pic=0");
while($t = $db->FetchResult($stmt,MYSQL_NUM)){
  $planeten[] = array($t[0], $t[1]);
}
while($insert) {
$x = rand(0, 1000);
$y = rand(0, 1000);
if(!in_array(array($x, $y), $planeten)) $insert = "Eintrag frei: " . $x . ":" . $y;
}


Aber es könnten ja auch maximal eine MILLIONEN Einträge in der Datenbank sein, habe ich auch getestet -> Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 39 bytes) in D:\Xampp\htdocs\game\libs\mysqldb_class.php on line 676

Es ist also eine gute Frage was ich machen soll. Macht mal Vorschläge :D


EDIT:

Die Array-Funktion war falsch :-/ Es hätte heißen müssen:
"SELECT x, y FROM world WHERE pic!=0"

So dauert es auch sehr lange:
Ausführungsdauer: 1.772397995 Sekunden

Und in der Datenbnak sind nur 32k Einträge drin, also kann man vergessen.....



Habe es mal so gemacht wie theHacker geschrieben hat und ES FUNZT :D Richtig gut :)

Ausführungsdauer: 0.00579309463501 Sekunden

Man kann also das Thema als gelöst sehen :D
 
Zuletzt bearbeitet: