programing

PHP를 사용하여 데이터베이스에서 반복하지 않고 난수를 생성하는 방법?

easyjava 2023. 9. 21. 21:39
반응형

PHP를 사용하여 데이터베이스에서 반복하지 않고 난수를 생성하는 방법?

데이터베이스 안에서 반복되지 않는 5자리 숫자를 생성하고 싶습니다.my_number라는 필드가 있는 number_mst라는 테이블이 있다고 가정해 보겠습니다.

이 my_number 필드에서 반복되지 않는 방식으로 번호를 생성하고자 합니다.그리고 앞의 0은 여기서 허용됩니다.따라서 00001과 같은 번호는 허용됩니다.또 하나는 00001에서 99999 사이여야 한다는 것입니다.내가 어떻게 그럴 수 있을까?

여기서 내가 추측할 수 있는 한 가지는 내가 숫자를 테이블로 체크하고 생성하기 위해 재귀 함수를 만들어야 할 수도 있다는 것입니다.

SELECT FLOOR(RAND() * 99999) AS random_num
FROM numbers_mst 
WHERE "random_num" NOT IN (SELECT my_number FROM numbers_mst)
LIMIT 1

작업 내용:

  1. RAND()를 사용하여 0 - 1 사이의 난수를 선택합니다.
  2. 0에서 99999 사이의 숫자가 되도록 증폭합니다.
  3. 테이블에 존재하지 않는 항목만 선택합니다.
  4. 1개의 결과만 반환합니다.

number_mst가 비어 있을 때 작동하도록 하는 투샤르의 답변 외에도:

SELECT random_num
FROM (
  SELECT FLOOR(RAND() * 99999) AS random_num 
  UNION
  SELECT FLOOR(RAND() * 99999) AS random_num
) AS numbers_mst_plus_1
WHERE `random_num` NOT IN (SELECT my_number FROM numbers_mst)
LIMIT 1

참고: 게시된 다른 솔루션은 열이 다음과 같이 구성된 경우에만 작동합니다.NOT NULL.한다면NULL, 아무 결과도 없을 겁니다다음과 같이 쿼리를 수정할 수 있습니다.

SELECT random_num
FROM (
  SELECT FLOOR(RAND() * 99999) AS random_num
) AS numbers_mst_plus_1
WHERE random_num NOT IN (SELECT my_number FROM numbers_mst WHERE my_number IS NOT NULL)
LIMIT 1

... 꼭 필요합니다!

편집: 저는 단지 제가 의도적으로 내부를 제거했다는 것을 말씀드리고 싶었습니다.SELECT표 이름은 필요 없을 것 같고 표에 자료가 없으면 깨질 것 같아서요?하지만 혹시 의도적으로 포함된 것은 아닐까요?— 모든 분들께 설명해주시거나 댓글 달아주세요, 감사합니다.

이 방법은 데이터베이스 확인 없이 고유 코드 생성기를 만드는 가장 쉬운 방법으로, 데이터베이스 쿼리 실행 시간을 절약할 수 있습니다.

function unique_code_generator($prefix='',$post_fix='')
    {
        $t=time();
        return ( rand(000,111).$prefix.$t.$post_fix);
    }

즐거운 코딩데이 되세요..

:)

  1. 난수를 생성합니다.

  2. 데이터베이스에 난수가 있는지 확인합니다.

  3. 그렇지 않으면 이 번호를 사용합니다.

  4. 1단계로 이동합니다.

두 가지 접근 방식이 있습니다.

첫 번째는 mt_rand()를 사용하여 난수를 생성하고 데이터베이스에 없는지 확인하는 것입니다.데이터베이스에 있는 경우 다시 생성한 후 다시 시도합니다.이것은 단일 숫자를 생성하는 경우에 가장 간단합니다. 코드에 대해서는 다른 답변을 참조하십시오.그러나 만약 당신이 숫자의 50% 이상을 발생시킨다면 매우 느리고 비효율적일 것입니다.

숫자를 많이 원하는 경우 데이터베이스에 모든 레코드를 채우고 열을 "선택"하는 방법이 있습니다.쿼리를 실행하여 "선택되지 않은" 개수를 찾은 다음 0과 "선택되지 않은" 개수 사이의 임의의 개수를 찾습니다.그런 다음 SQL 쿼리를 실행하여 해당 위치의 번호를 얻고(선택되지 않은 경우 mysql에서 LIMIT를 사용) 선택된 것으로 표시합니다.약간 복잡하지만, 몇 개의 숫자만 원한다면 더 많은 작업과 효율성이 떨어지지만, 그 숫자의 50% 이상(추정)을 얻고 싶을 때 훨씬 더 나을 것입니다.

참고: 선택한 개수를 로컬에 저장하고 쿼리를 몇 개 덜 실행하면 효율성을 높일 수 있습니다.

으로 이 분 분이 , 0 의, LPAD()기능.

그래서 당신의 질문은 좋아할 것입니다.

SELECT LPAD(FLOOR(RAND()*99999),5,0)

좋은 하루 되세요.

다음 쿼리는 0에서 99,999 사이의 모든 int를 생성하고 대상 테이블에서 사용되지 않는 값을 찾아 다음과 같은 무료 숫자 중 하나를 임의로 출력합니다.

SELECT random_num FROM (
    select a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) + (10000 * e.a) as random_num
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as e
) q
WHERE random_num NOT IN(SELECT my_number FROM numbers_mst)
ORDER BY RAND() LIMIT 1

네, 길고 느리며 확장성이 없지만 독립 실행형 쿼리로 작동합니다!범위를 늘리거나 줄이기 위해 "0" 제거(Joins a, b, c, d, e)를 더 추가할 수 있습니다.

예를 들어 모든 날짜가 있는 행을 만드는 데 이러한 종류의 행 생성기 기법을 사용할 수도 있습니다.

DELIMITER $$

USE `temp` $$

DROP PROCEDURE IF EXISTS `GenerateUniqueValue`$$

CREATE PROCEDURE `GenerateUniqueValue`(IN tableName VARCHAR(255),IN columnName VARCHAR(255)) 
BEGIN
    DECLARE uniqueValue VARCHAR(8) DEFAULT "";
    DECLARE newUniqueValue VARCHAR(8) DEFAULT "";
    WHILE LENGTH(uniqueValue) = 0 DO
        SELECT CONCAT(SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1)
                ) INTO @newUniqueValue;
        SET @rcount = -1;
        SET @query=CONCAT('SELECT COUNT(*) INTO @rcount FROM  ',tableName,' WHERE ',columnName,'  like ''',newUniqueValue,'''');
        PREPARE stmt FROM  @query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    IF @rcount = 0 THEN
            SET uniqueValue = @newUniqueValue ;
        END IF ;
    END WHILE ;
    SELECT uniqueValue;
    END$$

DELIMITER ;

이 저장 프로시저를 사용하면 다음과 같은 동적 값과 함께 사용할 수 있습니다.

call GenerateUniqueValue('tablename', 'columnName')

간단히 해결할 수 있는 것은 다음과 같습니다.

$regenerateNumber = true;

do {
    $regNum      = rand(2200000, 2299999);
    $checkRegNum = "SELECT * FROM teachers WHERE teacherRegNum = '$regNum'";
    $result      = mysqli_query($connection, $checkRegNum);

    if (mysqli_num_rows($result) == 0) {
        $regenerateNumber = false;
    }
} while ($regenerateNumber);

$regNum입니다에 값을 .

아주 간단하게, 저장된 절차로 MySQL에서 코드를 수행했습니다.

8자리의 난수를 생성하고 데이터베이스의 테이블과 고유하게 생성합니다.

저한테는 효과가 있어요.

CREATE DEFINER=`pro`@`%` PROCEDURE `get_rand`()
BEGIN
DECLARE regenerateNumber BOOLEAN default true;
declare regNum int;
declare cn varchar(255);
repeat
SET regNum      := FLOOR(RAND()*90000000+10000000);
SET cn =(SELECT count(*) FROM stock WHERE id = regNum);
select regNum;
if cn=0
then
SET regenerateNumber = false;
end if;
UNTIL regenerateNumber=false
end repeat;
END

이것은 명백한 해결책이지만 SQL 방식으로 해결할 수 있을지 의문입니다.매번 독특하지 않을 때마다 점검하고 재생해야 하기 때문에 시도 횟수가 결정적이지 않습니다.누군가 그것이 틀렸다는 것을 증명할 수 있다면 다행입니다.

declare o int;
select id from otp where chatid=chat into o;
if o is null then
    SELECT FLOOR(RAND()*9000 + 1000) into o;

    while o in (select id from otp) do
        SELECT FLOOR(RAND()*9000 + 1000) into o;
    end while;
    
    insert into otp (id,chatid) values (o,chat);

end if;
return o;

언급URL : https://stackoverflow.com/questions/11680025/how-to-generate-random-number-without-repeat-in-database-using-php

반응형