2014-10-29 1 views
1

mytable은 자동으로 증가하는 id 열을 정수로 가지며 모든 용도와 목적으로 이 경우 인 경우 더 높은 ID가 최신 값을 나타내는 것으로 안전하게 간주 할 수 있습니다. mytable에는테이블에 대한 외래 키인 group_id이라는 인덱싱 된 열이 있습니다.MySQL에서 동적 UNION 쿼리는 어떻게 수행합니까?

group_id에서 가장 최근 5 개의 행을 선택하려면 신속하고 더러운 쿼리를 mytable에서 사용하고 싶습니다.

세 개의 그룹, 난 할 수 있기 때문에이 쉬운 것이 있다면 :

SELECT * FROM `mytable` WHERE `group_id` = 1 ORDER BY `id` DESC LIMIT 5 
UNION ALL 
SELECT * FROM `mytable` WHERE `group_id` = 2 ORDER BY `id` DESC LIMIT 5 
UNION ALL 
SELECT * FROM `mytable` WHERE `group_id` = 3 ORDER BY `id` DESC LIMIT 5 

그러나, 그룹의 고정 된 수의가없는가. 그룹은 groups 테이블의 내용에 따라 결정되므로 불확정 한 숫자가 있습니다.

지금까지 내 생각 :

  • 나는 그 다음 EXECUTEgroups 테이블에 CURSOR을 잡고 새로운 SQL 쿼리 문자열을 만들 수있다. 그러나, 그것은 정말 지저분 해 보입니다. 나는 그것을하는 더 좋은 방법이 있기를 바라고 있습니다.
  • groups 테이블에서 CURSOR을 잡고 임시 테이블에 삽입 한 다음 그 테이블에서 선택할 수 있습니다. 그러나, 그것은 또한 정말 지저분 해 보입니다.
  • 그냥 CURSOR을 잡고 그곳에서 직접 행을 반환 할 수 있는지 잘 모르겠습니다. SQL 서버의 @table 유형 변수와 비슷한 것이 있습니까?
  • 내가 가장 기대하는 것은 내가 이것을 과소 평가하고 SELECT 문에서이를 수행 할 수있는 방법이 있다는 것입니다.

답변

1

그룹당 가장 최근의 행을 얻으려면 다른 RDBMS (SQL Server, Postgre Sql, Oracle 등)의 창 함수를 사용하는 것이 가장 좋지만 불행히도 MySql에는 창 함수가 없으므로 대안이 있습니다. 해결책은 ORDER BY group_id,id desc 쿼리 위

SELECT c.* 
FROM (
SELECT *, 
@r:= CASE WHEN @g = group_id THEN @r + 1 ELSE 1 END rownum, 
@g:=group_id 
FROM mytable 
CROSS JOIN(SELECT @g:=NULL ,@r:=0) t 
    ORDER BY group_id,id desc 
) c 
WHERE c.rownum <=5 

group_id하고 당신에게 5 개 최근 행을 줄 것이다 제대로 그룹 별 결과를 정렬하는 것이 중요하다,이 경우 같은 그룹에 속한 행에 대한 순위를 할당하는 사용자 정의 변수를 사용하는 5 개 이상의 행을 가져 오려면 외부 쿼리의 필터를 원하는 숫자로 변경하십시오. WHERE c.rownum <= n

+0

여기서 무엇을하고 있는지 자세히 알아볼 수있는 곳은 어디입니까? 전에'@x : = '구문을 본적이 없습니다. – SoaperGEM

+0

@SoaperGEM 여기에 좋은 자습서 중 하나입니다 http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ –

관련 문제