За последние 24 часа нас посетили 34922 программиста и 1753 робота. Сейчас ищут 846 программистов ...

Случайный вывод из таблички

Тема в разделе "MySQL", создана пользователем newnoob, 5 июл 2007.

  1. newnoob

    newnoob Активный пользователь

    С нами с:
    8 авг 2006
    Сообщения:
    151
    Симпатии:
    0
    Есть обычный запрос типа:

    Код (Text):
    1.  
    2. $result = $db->sql_query("SELECT lid, cid, title, date, description FROM ".$prefix."_board WHERE status='1' AND vip='1' AND cid='1' ORDER BY lid DESC LIMIT 5");
    Суть, нужно выводить не по порядка к примеру 5,4,3,2,1 , а хаотично тоесть 4,1,3,5,2, иными словами каждый раз случайный вывод.
     
  2. Anonymous

    Anonymous Guest

    [sql]ORDER BY RAND()[/sql]
     
  3. Davil

    Davil Guest

    Пора в отдельную тему выносить объявление -
    "Если вы хотите вывдоить данные из базы в случайном порядке, пользуйтесь ORDER BY RAND()" =)
     
  4. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Гы, сталкнулся с интересной вещью
    Запрос
    [sql]SELECT `text` FROM `base` ORDER BY RAND( ) LIMIT 1[/sql]
    Результат
    И это при сравнительно не большой базе (48 тысяч записей)

    Структура базы
    [sql]CREATE TABLE `base` (
    `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
    `text` varchar(2048) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=48614 ;[/sql]

    Есть идеи ?
     
  5. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а если так? :)
    [sql]SELECT `text` FROM `base` where `id`>=rand(select max(id) from `base`) LIMIT 1[/sql]
     
  6. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Так оно и не должно заработать...

    Как "костыль" можно попробовать так
    [sql]SELECT `text` FROM `base` where `id` >= CEIL(RAND() * (SELECT MAX(`id`) FROM `base`)) LIMIT 1[/sql]

    Но больше интересует почему тормозит "простой" вариант.
     
  7. Anonymous

    Anonymous Guest

    Vladson, у меня смутное подозрение, что
    [sql]SELECT `id`,`text` FROM `base` ORDER BY RAND( ) LIMIT 1[/sql]
    будет несколько быстрее?
     
  8. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    а ты уверен что он тормозит? при работе с дисковыми операциями интерпретатор слишком оптимизирует, возможно даже очередность выполнения, он может и -20 сек показать.

    зы
    не перебрал с экономией?
     
  9. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
    Предлагаю сделать в каждой ветке форума прикрепленную тему, что то типа FAQа. Ведь про SELECT * FROM table ORDER BY RAND() уже несколько тем создано.
    Да и по другим вопросам тоже.
     
  10. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а что показывает explain?
     
  11. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Горбунов Олег ноль разницы
    Я уверен что запрос, вот только почему не знаю (настройки MySQL все дефолтные)
    Там такие данные что их не может быть больше 65тыс но это оф-топ
    не знаю, в поиске нашёл только эту но это оф-топ
     
  12. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    http://www.php.su/forum/printpage.php?forum=1&topic=222
    $maxid=48000; // show table status
    $rid=rand(1,$maxid);
    $sql="select text from base where id<".$rid." order by id desc limit 1";

    не совсем рендом, т.к. в таблице может быть autoincrement=200k и ид от 100к

    http://newcontinent.ru/h/mysqlc/06.htm

    Собственно, он вычисляет rand() для каждой записи и потом смотрит что меньше.

    но все равно 20 сек - это глюк отображения. Если не на п1 запускать.
    Какой объем таблицы в метрах?
     
  13. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    $rid=rand(1,$numrows);
    $sql="select text from base order by id asc limit ".$rid.",1";

    Вопрос:
    Как выбрать 20 случайных записей?
     
  14. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Vladson, судя по всему мускул создаёт временную таблицу куда в случайном порядке копирует данные из исходной. а потом берёт первое значение... жэсть :) при запросе винч не шуршит случаем как бешенный?