Mój sposób jest jednym z wielu niekoniecznie najlepszym, wymyślonym na szybko ale działającym.
Przygotuj sobie tabelkę pomocniczą:
CREATE TABLE Pos
(
id INT NOT NULL AUTO_INCREMENT,
x INT NOT NULL,
y INT NOT NULL,
CONSTRAINT PK_Pos PRIMARY KEY (id),
CONSTRAINT BK_Pos UNIQUE INDEX NONCLUSTERED (x, y)
);
Wypełnij ją wszystkimi dopuszczalnymi wartościami:
DECLARE myx INT DEFAULT -100;
DECLARE myy INT DEFAULT -100;
WHILE myx <= 100 DO
BEGIN
WHILE myy <= 100 DO
BEGIN
INSERT INTO Pos (x, y) VALUES (myx, myy);
SET myy = myy + 1;
END;
END WHILE;
SET myy = -100
SET myx = myx + 1;
END;
END WHILE;
Na tak przygotowanej bazie wystarczy wykonać jednego selecta w celu pobrania wartości, która jeszcze nie występuje w tabeli "Tabela".
SELECT p.x, p.y
FROM Pos p
LEFT OUTER JOIN Tabela t ON t.x = p.x AND t.y = p.y
WHERE t.id IS NULL
ORDER BY RAND()
LIMIT 0, 1;