Выборка нескольких случайных записей из таблицы

Тема в разделе "Базы данных", создана пользователем askarbin, 15 окт 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. askarbin

    askarbin

    Регистр.:
    31 мар 2009
    Сообщения:
    293
    Симпатии:
    36
    Подскажите, пожалуйста, ничего в голову не приходит. Нужно осуществить выборку трех случайных записей из таблицы, в которой поля идентификатора идут не в строгом порядке, т.е. 1,2,3,4,5,10,11,12,13,44,45,56,57... и т.д.
    Если одним запросом это невозможно сделать, то может быть кто-то подскажет идею в связке с пхп?
     
  2. Sanuch

    Sanuch

    Регистр.:
    25 май 2009
    Сообщения:
    207
    Симпатии:
    70
    если вам трех случайных записей, а не полей, тогда
    Код:
    SELECT * FROM table ORDER BY RAND() LIMIT 3
     
  3. askarbin

    askarbin

    Регистр.:
    31 мар 2009
    Сообщения:
    293
    Симпатии:
    36
    Дело в том, что такой запрос, насколько мне известно, сильно загружает базу, т.к. mysql записывает во временную таблицу все строки исходной таблицы. При количестве записей > 100 000, нагрузка ощутима, ищу более "легкий" вариант решения проблемы, возможно стоит обратиться в сторону пхп и составить несколько запросов, но я никак не могу сообразить.
     
  4. Sanuch

    Sanuch

    Регистр.:
    25 май 2009
    Сообщения:
    207
    Симпатии:
    70
    в скрипте вы можете выбрать только из входных данных, которые в свою очередь будут или идентификаторами строк, или общим количеством строк в таблице. имхо
     
  5. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    например так будет легче:
    PHP:
    $res=mysql_query('SELECT count(*) FROM table');
    $count=mysql_fetch_array($res)[0];
    $result=mysql_query('SELECT * FROM table LIMIT '.rand(0,$count-1).',1');
    обработать напильником и доработать по вкусу(JOIN,etc..)
     
    _acid_ и askarbin нравится это.
  6. Darkmind

    Darkmind SNMP maniac

    Регистр.:
    31 май 2006
    Сообщения:
    182
    Симпатии:
    74
    Менее затратный способ выборки случайных полей одним запросом. Вместо LIMIT 2 поставить LIMIT [сколько нужно]

    Код:
    SELECT `id`,`value`, RAND() as rnd_id FROM `jos_jf_content` ORDER BY rnd_id LIMIT 2
     
    askarbin нравится это.
  7. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    Darkmind, чем ваш запрос быстрее чем запрос Sanuch-а?
    порядок скорости одинаков
     
  8. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    вы считаете, что это главная проблема?
    главная проблема в суммарной нагрузке.даже если снять ограничения выполнения, сервер может повесится на больших объемах данных.

    вот еще нагуглил интересное решение.
    автор гарантирует существенный прирост скорости
    http://ya-krevetko.com/archives/4
     
  9. Necromancer

    Necromancer Прохожие

    А например добавить 3 переменных например:
    $id_var1 = rand (0, 1000);
    $id_var2 = rand (0, 1000);
    $id_var3 = rand (0, 1000);

    И потом из базы извлечь только те row'ы где id = нашим переменным?
     
  10. Laba

    Laba Создатель

    Регистр.:
    27 сен 2009
    Сообщения:
    18
    Симпатии:
    2
    В таблице может не быть записи с таким id :( Что тогда делать?
     
Статус темы:
Закрыта.