mysql> SELECT * from ticket WHERE user_id = 0 ORDER BY sort LIMIT 10;
+--------+------+---------+
| id | sort | user_id |
+--------+------+---------+
| 923164 | 1 | 0 |
| 171274 | 2 | 0 |
| 217458 | 3 | 0 |
| 182627 | 4 | 0 |
| 183120 | 5 | 0 |
| 483756 | 6 | 0 |
| 210156 | 7 | 0 |
| 362920 | 8 | 0 |
| 311591 | 9 | 0 |
| 545096 | 10 | 0 |
+--------+------+---------+
10 rows in set (0.00 sec)
mysql> UPDATE ticket SET user_id = 1 WHERE id IN (923164, 171274, 217458);
Query OK, 3 rows affected (0.01 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> SELECT * from ticket WHERE user_id = 0 ORDER BY sort LIMIT 10;
+--------+------+---------+
| id | sort | user_id |
+--------+------+---------+
| 182627 | 4 | 0 |
| 183120 | 5 | 0 |
| 483756 | 6 | 0 |
| 210156 | 7 | 0 |
| 362920 | 8 | 0 |
| 311591 | 9 | 0 |
| 545096 | 10 | 0 |
| 230442 | 11 | 0 |
| 472816 | 12 | 0 |
| 138187 | 13 | 0 |
+--------+------+---------+
10 rows in set (0.00 sec)
CREATE TABLE t (ticket_id INT, user_id INT default 0, PRIMARY KEY (ticket_id));
INSERT INTO t(ticket_id) VALUES(rand()*1000000); //Генерация может занять долго, зато 1 раз :-)
UPDATE t SET user_id = 1 WHERE user_id = 0 limit 1; //Продаём билет.
SELECT t.id, t.flag FROM test t,
(SELECT id mn FROM test WHERE flag = 0 LIMIT 1) tmp1,
(SELECT ROUND((SELECT MAX(id) FROM test)*rand()) rnd FROM test LIMIT 1) tmp2
WHERE t.id >= rnd AND t.id > mn AND t.flag = 0
LIMIT 1
SELECT t.id, t.flag FROM test t,
(SELECT id mn FROM test WHERE flag = 0 LIMIT 1) tmp1,
(SELECT ROUND(((SELECT id FROM test WHERE flag = 0 ORDER by id DESC LIMIT 1)-(SELECT id FROM test WHERE flag = 0 LIMIT 1))*rand()+(SELECT id FROM test WHERE flag = 0 LIMIT 1)) rnd FROM test LIMIT 1) tmp2
WHERE t.id >= rnd AND t.id >= mn AND t.flag = 0
LIMIT 1
Разве при таком подходе каждый купленный билет не повышает вероятность покупки следующего порядкового билета? К примеру, если куплены все билеты от 0 до 500000, то любое случайное число от 0 до 500000 приведёт к покупке 500001 билета. Таким образом, вероятность его покупки будет примерно 50%.