> 데이터 베이스 > MySQL 튜토리얼 > MySQL의 각 그룹에서 N 번째 레코드를 얻는 방법

MySQL의 각 그룹에서 N 번째 레코드를 얻는 방법

高洛峰
풀어 주다: 2016-11-22 10:47:24
원래의
1281명이 탐색했습니다.

문제 배경

1) 제한 사항: 각 사용자는 한 카테고리에서 주문에 대해 최대 4번까지 무료 할인을 받을 수 있습니다.

즉, 무료배송 할인을 받은 주문 건수를 계산할 때 동일한 카테고리에서 4번째 주문 이후 주문은 제외되어야 합니다.

ID를 얻는 방법 동일한 카테고리에서 각 사용자가 네 번째 주문을 하였습니까?

select fourth(id) from order group by user_id, category;
로그인 후 복사

안타깝게도 Mysql에는 각 그룹의 네 번째 ID를 쉽게 얻을 수 있는 그룹화 기능이 없습니다. 하지만 해결 방법이 있을 수 있습니다. 예를 들어

select * from t;
+----+--------+----------------------------------+
| id | status | user_id                          |
+----+--------+----------------------------------+
|  1 | 10     | 24e568a88fae11e6bb0650b497d97cdd |
|  2 | 10     | 24e568a88fae11e6bb0650b497d97cdd |
|  3 | 20     | 24e568a88fae11e6bb0650b497d97cdd |
|  4 | 20     | 24e568a88fae11e6bb0650b497d97cdd |
|  5 | 10     | e8669ac28fae11e6bb0650b497d97cdd |
|  6 | 20     | e8669ac28fae11e6bb0650b497d97cdd |
|  7 | 10     | e8669ac28fae11e6bb0650b497d97cdd |
|  8 | 20     | e8669ac28fae11e6bb0650b497d97cdd |
|  9 | 10     | e8669ac28fae11e6bb0650b497d97cdd |
+----+--------+----------------------------------+
로그인 후 복사

각 사용자의 두 번째 결제 성공(상태='10') 주문을 가져오는 방법은 무엇입니까?

MySQL의 각 그룹에서 N 번째 레코드를 얻는 방법

방법 1 - 하나씩 조회

select * from t where user_id = '24e568a88fae11e6bb0650b497d97cdd' and status = '10' order by id limit 1,1;
+----+--------+----------------------------------+
| id | status | user_id                          |
+----+--------+----------------------------------+
|  2 | 10     | 24e568a88fae11e6bb0650b497d97cdd |
+----+--------+----------------------------------+
로그인 후 복사

옵션 2 - 일회성 조회

SELECT 
    *
FROM
    (SELECT 
        id,
            user_id,
            @rank:=IF(@current_user_id = user_id, @rank + 1, 1) rank,
            @current_user_id:=user_id
    FROM
        (SELECT @current_user_id:=NULL, @rank:=NULL) vars, t
    WHERE
        t.status = '10'
    ORDER BY user_id , id) a
WHERE
    rank = 2;
    
+----+----------------------------------+------+----------------------------------+
| id | user_id                          | rank | @current_user_id:=user_id        |
+----+----------------------------------+------+----------------------------------+
|  2 | 24e568a88fae11e6bb0650b497d97cdd |    2 | 24e568a88fae11e6bb0650b497d97cdd |
|  7 | e8669ac28fae11e6bb0650b497d97cdd |    2 | e8669ac28fae11e6bb0650b497d97cdd |
로그인 후 복사

원리 설명

먼저 user_id와 id로 정렬한 후 1부터 일련번호를 할당합니다. 동일한 사용자는 증가하고, 다른 사용자는 다시 1부터 시작합니다.


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿