MySQL은 두 값 사이에서 랜덤 값을 가져옵니다.
두 개의 열이 연속으로 있습니다.min_value
,max_value
. 다음과 같은 선택을 할 수 있는 방법이 있습니까?
SELECT RAND(`min_v`, `max_v`) `foo` [..]
알고 있습니다RAND
다른 일을 한다; 내가 (도움으로) 접근한 가장 가까운 것은(RAND() * (max-min))+min
float 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
'IT' 카테고리의 다른 글
Python 형식 문자열에서 %s의 의미는 무엇입니까? (0) | 2023.01.21 |
---|---|
치명적 오류: 정의되지 않은 함수 mysql_connect() 호출 (0) | 2023.01.21 |
문자열에서 모든 특수 문자 제거 (0) | 2023.01.21 |
Maria에서 JSON_QUERY를 사용하여 개체 JSON 어레이를 가져오는 중DB (0) | 2023.01.21 |
PHP가 특정 문자열 앞에 있는 모든 문자를 제거합니다. (0) | 2023.01.21 |