sourcetip

MYSQL의 하위 쿼리에서 LIMIT 키워드를 사용하는 대신

fileupload 2023. 9. 5. 20:44
반응형

MYSQL의 하위 쿼리에서 LIMIT 키워드를 사용하는 대신

다음 열이 있는 테이블 테스트가 있습니다.

code_ver (VARCHAR)
suite (VARCHAR)
date (DATE)

이제 c의 고유한 값을 가진 10개의 행을 선택합니다.ode_ver & code_ver NOT LIKE '%DevBld%' sorted by date desc.

그래서 저는 다음과 같은 질문을 작성했습니다.

select * 
  from test 
 where code_ver IN (select DISTINCT code_ver 
                      from test 
                     where code_ver NOT LIKE '%DevBld%' 
                     ORDER by date DESC LIMIT 10);

이 쿼리는 이상적으로 작동해야 하지만 MySQL 버전은 다음과 같이 말합니다.

이 버전의 MySQL은 아직 'LIMIT & IN/ALL/ANY/SOME 하위 쿼리'를 지원하지 않습니다.

누가 나에게 이 질문에 대한 대안을 제안해 줄 수 있습니까?

레이케가 제안한 답은 제가 볼 때 틀렸습니다.하위 쿼리에서 제한을 사용하려는 의도는 하위 쿼리에서 가져온 제한된 레코드에 대한 주요 쿼리 실행입니다.그리고 만약 우리가 제한을 외부로 유지한다면, 그것은 제한을 하위 질의에 쓸모없게 만듭니다.

mysql은 아직 하위 쿼리 제한을 지원하지 않으므로 대신 다음과 같이 JOIN을 사용할 수 있습니다.

       
    SELECT * FROM test
    JOIN 
    (
        SELECT DISTINCT code_ver 
        FROM test 
        WHERE code_ver NOT LIKE '%DevBld%' 
        ORDER BY date DESC LIMIT 10
    ) d
    ON test.code_ver
    IN (d.code_ver)
    ORDER BY xyz;

하위 쿼리 앞에 선택 계층을 하나 더 추가하는 것만으로 동일한 쿼리를 사용할 수도 있습니다.그건 작동할 것이다.

select * from test 
where code_ver IN (select * from (select DISTINCT code_ver 
                      from test 
                     where code_ver NOT LIKE '%DevBld%' 
                     ORDER by date DESC LIMIT 10) as t1);

파생 테이블에 하위 쿼리를 배치합니다.

   SELECT test.*
     FROM test
LEFT JOIN (SELECT DISTINCT code_ver
             FROM mastertest
            WHERE code_ver NOT LIKE '%DevBld%'
            ORDER BY `date` DESC
            LIMIT 10) d
    USING (code_ver)
    WHERE d.code_ver IS NOT NULL;

(물론 오른쪽으로 조인하여 외부 WHERE 조건을 삭제할 수도 있습니다.)

조금 늦었을 수도 있지만 하위 쿼리를 다른 쿼리에 랩핑하여 하위 쿼리에서 모두 가져올 수 있습니다.

   SELECT * FROM tableWHERE id NOT IN 
    (SELECT * FROM 
        ( SELECT id FROM table LIMIT 0, 2) as SUBQUERY
    )
select * from test t1, (select DISTINCT code_ver 
                      from test 
                     where code_ver NOT LIKE '%DevBld%' 
                     ORDER by date DESC LIMIT 10 ) as t2
where t1.code_ver=t2.code_ver

오류가 발생한 것은 MySQL 버전 때문이 아닙니다.저는 모든 버전이 그것을 지원한다고 생각합니다.LIMIT 10 위치를 변경하여 " 뒤에 배치해야 합니다.그것이 당신에게 효과가 있다면 제게 알려주세요.저는 제 것에 아래의 것을 실행했고 그것은 작동합니다.

예.

SELECT * FROM test where name IN (
           SELECT DISTINCT name 
           FROM projects 
           WHERE name NOT LIKE "%DevBld%"  
           ORDER by date_created DESC
 ) LIMIT 10;

업데이트: 아래 항목을 사용해 보십시오. 이 방법으로 주문할 수 있습니다.

 SELECT * FROM  automation.e2e_projects WHERE name IN (
       SELECT DISTINCT name 
       FROM automation.e2e_projects
       WHERE name NOT LIKE "%DevBld%"
 ) ORDER by date_created DESC LIMIT 10;

언급URL : https://stackoverflow.com/questions/12810346/alternative-to-using-limit-keyword-in-a-subquery-in-mysql

반응형