Помогите построить sql запрос для выбора случайных значений

Тема в разделе "Базы данных", создана пользователем Inviseble_Demon, 13 ноя 2012.

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

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    351
    Таблица
    [​IMG]
    нужно получить случайный url в котором n_stat <= n
     
  2. Qwest-fx

    Qwest-fx Постоялец

    Регистр.:
    3 апр 2007
    Сообщения:
    133
    Симпатии:
    40
    Код:
    select * from `table` where`table`.n_stat <= `table`.`n` ORDER BY RAND() limit1;
    

    Код:
    -- Host:                        127.0.0.1
    -- Server version:              5.1.62-log - Gentoo Linux mysql-5.1.62-r1
    -- Server OS:                    pc-linux-gnu
    -- HeidiSQL version:            7.0.0.4053
    -- Date/time:                    2012-11-13 11:21:54
    -- --------------------------------------------------------
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET NAMES utf8 */;
    /*!40014 SET FOREIGN_KEY_CHECKS=0 */;
     
    -- Dumping structure for table tmp_db.table
    CREATE TABLE IF NOT EXISTS `table` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `url` text,
      `n` int(10) DEFAULT NULL,
      `n_stat` int(10) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
     
    -- Data exporting was unselected.
    /*!40014 SET FOREIGN_KEY_CHECKS=1 */;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
     
    Inviseble_Demon нравится это.
  3. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    351
    2 trooll Не много около 50-100 записей.
    Решение найдено спасибо Qwest-fx
    2 kiker твоего решения так и не понял... оно как минимум не полное и не чистый sql это )) у меня был подобный сатонизм

    PHP:
    function GetSites()
    {
     
        
    $q=mysql_query("SELECT * FROM `fr`");
     
        while(
    $row=mysql_fetch_assoc($q))
            
    $out[]=array($row['url'], $row['n'], $row['n_stat']);
     
        return 
    $out;
    }
     
        
    $sites=GetSites();
     
        for (
    $i=0$count=count($sites); $i<$count$i++)
            if (
    $sites[$i][2] <= $sites[$i][1])
                
    $out[]=$sites[$i];
     
  4. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Попробуй так:
    Код:
    SELECT n, n_stat FROM `table` WHERE `n_stat` < `n` OR `n_stat` = `n` ORDER BY rand() LIMIT 1 
    или так

    Код:
    SELECT table.n, table.n_stat FROM `table` WHERE table.n_stat < table.n OR table.n_stat = table.n ORDER BY rand() LIMIT 1 
    (Не начем затестить так что пишу соображения из головы)

    Но этот запрос должен работать нормально до 10 000 записей в таблице или 1000 чегото не помню, потом тормаза начнуться, и придеться писать что то типа

    Код:
    SELECT name FROM table JOIN ( SELECT CEIL(RAND() * ( SELECT MAX(id) FROM table )) AS randomID ) AS random_table ON random_table.randomID=table.ID
    в место

    Код:
    ORDER BY rand() LIMIT 1
    UPD: Опередили меня:(
     
    latteo нравится это.
Статус темы:
Закрыта.