denlam
16.04.2010 - 15:19
Вообще проблема такая. В базе данных строки хранятся не по порядку, а что-то типа 5, 15,77 и так далее.
А мне нужно чтобы php обращался к БД, выбирал одну из строк и выдавал.
Какие есть идеи?
vagrand
16.04.2010 - 15:22
select * from table_name order by rand()
Но это не самый быстрый запрос
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
denlam
16.04.2010 - 15:24
а еще есть варианты?
vagrand
16.04.2010 - 16:13
а по сколько строк тебе надо выбирать за раз?
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
denlam
16.04.2010 - 20:02
только одну строку выбрать
MatrixGod
19.04.2010 - 02:43
$x = rand(1, 3);
switch($x)
{
case 1 : $row = 5; break;
case 2 : $row = 15; break;
case 3 : $row = 77; break;
}
так?
maxims
19.04.2010 - 03:48
Цитата (MatrixGod @ 18.04.2010 - 22:43) |
$x = rand(1, 3); switch($x) { case 1 : $row = 5; break; case 2 : $row = 15; break; case 3 : $row = 77; break; }
так? |
а если у него не три записи, а 1000000?
можно так:
1. сначала находим общее количество записей через COUNT();
2. генерируем случайное число от 0 до максимального;
3. запрос к базе с припиской LIMIT наше _сл_число, 1.
при этом мы не привязаны к какимто значениям в таблице.
з.ы.: думаю можно всё три действия сунуть в один запрос, на работе попрубую, позже отпишусь
1 вариант - как предложил
vagrand, если сайт не нагруженный.
2 вариант - кэшировать id записей и:
$entries = array(2,4,5,1,64,23,44);
echo $entries[array_rand($entries)];
denlam
19.04.2010 - 20:28
всем огромное спасибо! Понравился метод maxims . Буду ждать его отзывов после теста
Цитата |
можно так:
3. запрос к базе с припиской LIMIT наше _сл_число, 1.
при этом мы не привязаны к какимто значениям в таблице. |
Сдается мне что по индексу будет быстрее, но проверять лениво. Как вариант
WHERE `id` >= наше _сл_число LIMIT 1
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
denlam
19.04.2010 - 21:40
Цитата (maxims @ 18.04.2010 - 23:48) |
можно так: 1. сначала находим общее количество записей через COUNT(); |
Как узнать общее количество записей? Можно на этом подробнее?
$sql = mysql_query("SELECT COUNT(*) AS `int` FROM `table`");
$count = mysql_result($sql, 0);
maxims
20.04.2010 - 05:16
В один запрос все три действия запихнуть не получилось (((( может как-то и можно......
а в остальном мне добавить не чего, уже и так всё расписали что да как.
Во заметил, поздравляю.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
twinО!! крутяк! Спасибо! Так бы сухой спать ушел..
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.