IT

MySQL은 두 값 사이에서 랜덤 값을 가져옵니다.

itgroup 2023. 1. 21. 09:45
반응형

MySQL은 두 값 사이에서 랜덤 값을 가져옵니다.

두 개의 열이 연속으로 있습니다.min_value,max_value. 다음과 같은 선택을 할 수 있는 방법이 있습니까?

SELECT RAND(`min_v`, `max_v`) `foo` [..]

알고 있습니다RAND다른 일을 한다; 내가 (도움으로) 접근한 가장 가까운 것은(RAND() * (max-min))+minfloat number가 생성되는데, ROUND()가 필요합니다.이것은 완전히 잘못된 것입니다.

다른 방법을 제안할 수 없는 한(매우 유용할 것 같다) PHP 방식으로 하겠습니다.

정말로.ROUND((RAND() * (max-min))+min)MySQL에서 원하는 작업을 수행할 수 있는 가장 좋은 방법입니다.또한 ActionScript, JavaScript 및 Python에서 가장 좋은 방법입니다.솔직히 PHP 방식보다 편리하기 때문에 선호합니다.

몇 개의 행이 반환될지 모르기 때문에 PHP와 MySQL 중 어느 쪽을 사용하는 것이 좋은지 조언할 수는 없지만, 많은 값을 취급하고 있다면 MySQL을 사용하는 것이 좋을지도 모릅니다.

부록


PHP와 MySQL 중 어느 쪽이 더 나은지에 대한 질문이 있었습니다.원칙에 대한 토론을 시작하는 대신 다음을 실행했습니다.

<pre><?php

$c = mysql_connect('localhost', 'root', '');

if(!$c) die('!');
echo mysql_select_db('test', $c)?'Connection':'Failure';
echo PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING MYSQL RAND::::::::::::::::::::::::::::::'.PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT ROUND(RAND() * (200-10) + 10) FROM dual' );
    $r = mysql_fetch_array( $r );
}
$end = microtime(1);

echo  ($end - $start) . " for MySQL select".PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING PHP RAND::::::::::::::::::::::::::::::' .PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT 200 AS two, 10 AS tem FROM dual' );
    $r = mysql_fetch_array( $r );
    $r[2]= rand($r[0], $r[1]);
}
$end = microtime(1);

echo  ($end - $start) . " for PHP select".PHP_EOL;

MySQL이 약 2~3% 더 빠릅니다.

단, 이 기능을 사용하는 경우(MySQL에서 반환되는 열이 더 많아집니다).

<pre><?php

$c = mysql_connect('localhost', 'root', '');

if(!$c) die('!');
echo mysql_select_db('test', $c)?'Connection':'Failure';
echo PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING MYSQL RAND::::::::::::::::::::::::::::::'.PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT ROUND(RAND() * (200-10) + 10) as rd, 200 as two, 10 as ten FROM dual' );
    $r = mysql_fetch_array( $r );
}
$end = microtime(1);

echo  ($end - $start) . " for MySQL select".PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING PHP RAND::::::::::::::::::::::::::::::' .PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT 200 AS two, 10 AS tem FROM dual' );
    $r = mysql_fetch_array( $r );
    $r[2]= rand($r[0], $r[1]);
}
$end = microtime(1);

echo  ($end - $start) . " for PHP select".PHP_EOL;

MySQL이 3~4% 뒤처집니다(매우 일관성 없는 결과). ($r[2]에 어레이 인덱스 할당을 사용하지 않는 경우에도 거의 같은 결과가 됩니다.)

가장 큰 차이는 랜덤화 시스템 자체가 아니라 PHP로 반환되는 레코드의 수에서 기인하는 것으로 보인다.따라서 열 A, 열 B 및 임의 값이 필요한 경우 PHP를 사용합니다.랜덤 값만 필요한 경우 MySQL을 사용합니다.

이 방법은 각 값에 대해 동일한 통계적 확률을 보장합니다.

SELECT FLOOR((RAND() * (max-min+1))+min)

최소범위가 1인 경우, 당신은 단순하게 할 수 있습니다.

SELECT FLOOR((RAND() * max_range) + 1)


최소 범위가 0인 경우, 보다 간단하게

SELECT FLOOR((RAND() * max_range))

이런 거 할 수 있어요?

SELECT id, (FLOOR( 1 + RAND( ) *60 )) AS timer
FROM users
LIMIT 0 , 30

투고를 참조해 주세요.

테이블 내의 행 수에 따라 쿼리 또는 서브쿼리에서 rand()를 사용하는 것이 매우 느려질 수 있습니다.

랜덤 값을 먼저 변수에 넣은 다음 쿼리에서 해당 값을 사용하면 속도를 크게 향상시킬 수 있습니다.

예를 들어 400만 개 이상의 행이 있는 테이블에서...

이 작업에는 10분 이상 소요되었습니다.

SELECT
    *
FROM
    `customers` `Customer`
WHERE
    `id` = (
        SELECT
            FLOOR((RAND() * (max(`CustomerRand`.`id`) - min(`CustomerRand`.`id`) + 1)) + min(`CustomerRand`.`id`)) `random_id`
        FROM
            `customers` `CustomerRand`
    );

이 작업은 평균 3초 정도 소요되었습니다.

SELECT
   FLOOR((RAND() * (max(`CustomerRand`.`id`) - min(`CustomerRand`.`id`) + 1)) + min(`CustomerRand`.`id`)) `random_id`
FROM `customers` `CustomerRand` INTO @rand_id;

SELECT * FROM `customers` WHERE `id` = @rand_id;

저장 프로시저에 넣을 수도 있고, 자주 재사용할 수도 있습니다.저장 프로시저는 PHP 또는 Python 또는 다른 곳에서 호출할 수 있습니다.

랜드별 주문 사용 가능

SELECT virtual.num
FROM (
         SELECT 1 AS num UNION
         SELECT 2 AS num UNION
         SELECT 3 AS num
     ) virtual
ORDER BY RAND()
LIMIT 1

언급URL : https://stackoverflow.com/questions/6550155/mysql-get-a-random-value-between-two-values

반응형