문제 배경
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') 주문을 가져오는 방법은 무엇입니까?
방법 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부터 시작합니다.