[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка случайной строки из MySQL
geka96
Здравствуйте)) Делаю типо лотереи на удачу...т.е. есть пользователи, у каждого свой счёт от 0 до 100, при нажатии на кнопку должен выбраться случайный пользователь из БД и у кого больше счёт, тот победил...проблема в том, что нужно выбрать случайного пользователя, чтобы у него счёт был где-то от 5 до 100...т.е. хочу сделать как-нибудь, чтобы пользователь не всегда выигрывал...% выигрыша, чтобы был допустим 50%...так вот, пытаюсь для начала вытащить из БД пользователя у которого счёт больше или равно i и id больше или равен рандомному числу:
$query = "SELECT * FROM $table_name WHERE `score`>=$i and `id`>=$id LIMIT 1";
$i - это случайной число в пределах 5 и 100...
$id - это случайный id - порядковый номер у каждой строки в БД...

Вытащить получается..но не всегда, есть дыры, потому что иногда счёт в выбранной по id строке не совпадает...

Как убрать дыры? И как вообще сделать нормально мою задумку?)

Просто в php новичок, в основном занимаюсь flash)) Спасибо.



Спустя 29 минут, 20 секунд (23.08.2011 - 07:40) linker написал(а):
$query = "SELECT * FROM $table_name WHERE `score`>=$i and `id`>=$id ORDER BY RAND() LIMIT 1";
либо сначала
$query = "SELECT * FROM $table_name WHERE `score`>=$i and `id`>=$id";
потом результат сгребаем в массив на PHP, после чего из полученного массива получаем случайный элемент array_rand().

Спустя 4 минуты, 2 секунды (23.08.2011 - 07:44) kirik написал(а):
Ухх, linker :) Всё равно запостю)

Цитата (geka96 @ 23.08.2011 - 00:11)
есть дыры, потому что иногда счёт в выбранной по id строке не совпадает...

Странно.. у вас ведь AND стоит, а значит должно выводиться правильно.
Есть штука такая ORDER BY RAND() - поможет вытащить случайную запись.
Тоесть:
$query = "SELECT * FROM $table_name WHERE `score`>=$i AND `id`>=$id ORDER BY RAND() LIMIT 1";

Всё было бы замечательно, если бы не одно НО. ORDER BY RAND() довольно ресурсозатратная операция. И если у вас будет большая таблица и много подобных запросов, то есть вероятность что mysql "упадёт" (при условии что под WHERE попадает много записей).


UPD
linker, там во втором запросе LIMIT 1 надо убрать.

Спустя 27 минут, 22 секунды (23.08.2011 - 08:12) geka96 написал(а):
kirik, спасибо..) Уже один раз использовал ORDER BY RAND(), понял что это такое, через 2 часа после запуска заблокировали хостинг и полетела MySQL...)

Тогда сделаю так, если "дыра" - то ищем заного...) Только не знаю..как проверить, что дыра!?)

Спустя 6 минут, 32 секунды (23.08.2011 - 08:18) kirik написал(а):
Цитата (geka96 @ 23.08.2011 - 01:12)
Тогда сделаю так, если "дыра" - то ищем заного...)

Лучше уж тогда сделать как написал linker (второй вариант), только LIMIT поставить, например 50.. или 100.

Спустя 7 минут, 16 секунд (23.08.2011 - 08:26) geka96 написал(а):
kirik, странно..но даже если поставить LIMIT 50, то всё равно точно такие же дыры...в чём может быть дело? sad.gif

Спустя 8 минут, 42 секунды (23.08.2011 - 08:34) kirik написал(а):
Цитата (geka96 @ 23.08.2011 - 01:26)
в чём может быть дело?

Не могу знать.. давай дамп smile.gif

Спустя 9 минут, 42 секунды (23.08.2011 - 08:44) linker написал(а):
kirik
Ага, smile.gif копи-паст - с..ко коварный. Убрал. Думается мне, условие `id`>=$id можно и убрать.

Спустя 3 минуты, 45 секунд (23.08.2011 - 08:48) geka96 написал(а):
kirik, я так доволен)) Разобрался..короче максимальный счёт у игроков же 100, а рандомное число задается в пределах от 0 до 100...и кода я делал выборку из БД, то надо было писать не score>=i, а score<=i =) Потому что, если рандомное число выпадет например 100 и я пытаюсь вытащить значение которое больше 100, а в БД такого нету, вот и дыры из-за этого)) Спасибо))

UP только теперь получилось, что вытаскивается строка у которой score < i...т.е. может и попасться score равное 0..а мне это не нужно..т.е. как можно сделать, чтобы вытаскивалась строка у которой score < i и >5 !??
---------
Всё втупил...вот так: `score`<=$i and `score`>=5

Спустя 17 минут, 14 секунд (23.08.2011 - 09:05) linker написал(а):
Ну сделай так
$i = rand(5, 100);
echo $query = "SELECT * FROM `table_name` WHERE " . ($i > 50 ? "`score` >= 5 AND `score` <= " . $i : "`score` >= " . $i);


_____________
Пока они пьют водку и катаются на скейтах, мы строим бизнес и делаем деньги!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.