source

MySQL의 LIMIT 절 변수 사용

bestscript 2022. 11. 13. 19:37

MySQL의 LIMIT 절 변수 사용

my_size라는 INTEGER라는 입력 파라미터가 있는 스토어드 프로시저를 쓰고 있습니다.이 기능을 사용할 수중에LIMIT의 조항SELECT진술.지원되지 않는 것 같습니다만, 이 문제를 해결할 방법이 있을까요?

# I want something like:
SELECT * FROM some_table LIMIT my_size;

# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;

MySQL 5.5.6+를 사용할 수 없고 저장 프로시저를 쓰고 싶지 않은 분들을 위해 또 다른 변종이 있습니다.ROWNUM을 사용하여 서브선택에 where 절을 추가할 수 있습니다.

SET @limit = 10;
SELECT * FROM (
  SELECT instances.*, 
         @rownum := @rownum + 1 AS rank
    FROM instances, 
         (SELECT @rownum := 0) r
) d WHERE rank < @limit;

스토어드 프로시저

DELIMITER $
CREATE PROCEDURE get_users(page_from INT, page_size INT)
BEGIN
  SET @_page_from = page_from;
  SET @_page_size = page_size;
  PREPARE stmt FROM "select u.user_id, u.firstname, u.lastname from users u limit ?, ?;";
  EXECUTE stmt USING @_page_from, @_page_size;
  DEALLOCATE PREPARE stmt;
END$

DELIMITER ;

사용.

다음 예제에서는 start를 1과 11로 지정하여 매번 10개의 레코드를 가져옵니다.1과 11은 페이지 번호로부터 GET/POST 파라미터로 수신된 페이지 번호일 수 있습니다.

call get_users(1, 10);
call get_users(11, 10);

검색 결과 이 기사가 나왔다.아래의 관련 텍스트를 붙여넣었습니다.

다음은 limit 구에 변수 값을 할당할 수 있는 준비된 문장의 예를 보여 주는 포럼 게시물입니다.

http://forums.mysql.com/read.php?98,126379,133966#msg-133966

단, 프로시저 내에서 준비된 스테이트먼트가 프로시저 컴파일 시간 최적화를 가능하게 하는 것은 상상할 수 없기 때문에 이 버그는 어느 정도 주의를 기울여야 한다고 생각합니다.준비된 스테이트먼트는 프로시저 실행 시 컴파일되어 실행되어 효율성에 악영향을 미치는 것 같은 느낌이 듭니다.limit 구가 일반 프로시저 변수(예를 들어 프로시저 인수)를 받아들일 수 있는 경우 데이터베이스는 절차 내에서 나머지 쿼리에 대해 컴파일 시간 최적화를 수행할 수 있습니다.이렇게 하면 절차의 실행 속도가 빨라질 수 있습니다.난 전문가가 아니야.

이 답변이 늦어진 것은 알지만 SQL_SELECT_LIMIT을 사용해 보십시오.

예:

Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;

이 기능은 MySQL 5.5.6에 추가되었습니다.링크를 확인해 주세요.

이 기능만을 위해 MySQL 5.5로 업그레이드했고, 잘 작동합니다. 또한 5.5에는 많은 성능 업그레이드가 준비되어 있으며, 이를 전적으로 추천합니다.

다른 방법으로는 "Pradeep Sanjaya"와 동일하지만 CONCAT를 사용합니다.

CREATE PROCEDURE `some_func`(startIndex INT, countNum INT)
READS SQL DATA
  COMMENT 'example'
BEGIN
  SET @asd = CONCAT('SELECT `id` FROM `table` LIMIT ',startIndex,',',countNum);
  PREPARE zxc FROM @asd;
  EXECUTE zxc;
END;

MySQL 버전 5.5.6부터는 변수/파라미터로 및 를 지정할 수 있습니다.

자세한 내용은 5.5 설명서, 5.6 설명서 및 @Quassnoi의 답변을 참조하십시오.

MySql 5.0에서도 같은 문제에 직면하여 @ENArgit의 답변으로 프로시저를 작성했습니다.

CREATE PROCEDURE SOME_PROCEDURE_NAME(IN _length INT, IN _start INT)
BEGIN
    SET _start = (SELECT COALESCE(_start, 0));
    SET _length = (SELECT COALESCE(_length, 999999)); -- USING ~0 GIVES OUT OF RANGE ERROR
    SET @row_num_personalized_variable = 0;

    SELECT
    *,
    @row_num_personalized_variable AS records_total         
    FROM(
        SELECT
        *,
        (@row_num_personalized_variable := @row_num_personalized_variable + 1) AS row_num
        FROM some_table
    ) tb
    WHERE row_num > _start AND row_num <= (_start + _length);
END;

또한 조회에 의해 취득된 행의 합계도 records_total과 함께 포함되어 있습니다.

변수를 선언하고 설정한 후 LIMIt가 작동하여 StoredProcedure에 저장해야 합니다.일반 쿼리에서 작동하는지 확실하지 않습니다.

다음과 같습니다.

DECLARE rowsNr INT DEFAULT 0;  
SET rowsNr = 15;  
SELECT * FROM Table WHERE ... LIMIT rowsNr;

언급URL : https://stackoverflow.com/questions/245180/using-variable-in-a-limit-clause-in-mysql