問題の背景
1) 制限: 各ユーザーは、1 つのカテゴリの注文に対して最大 4 つの無料割引を享受できます。
つまり、送料無料割引を享受した注文数をカウントする場合、同じカテゴリ内の 4 回目の注文以降の注文は除外する必要があります。
同じカテゴリ内の 4 回目の注文の ID を取得する方法。ユーザーごとに?
select fourth(id) from order group by user_id, category;
残念ながら、Mysql には、各グループの 4 番目の ID を簡単に取得するためのグループ化機能がありません。ただし、回避策はあります。たとえば、次のようなテーブルがある場合、各ユーザーの 2 番目に成功した支払い (status='10') の順序を取得するにはどうすればよいでしょうか。
方法 1 -
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 | +----+--------+----------------------------------+
オプション 2 - 1 回限りのクエリ
select * from t where user_id = '24e568a88fae11e6bb0650b497d97cdd' and status = '10' order by id limit 1,1; +----+--------+----------------------------------+ | id | status | user_id | +----+--------+----------------------------------+ | 2 | 10 | 24e568a88fae11e6bb0650b497d97cdd | +----+--------+----------------------------------+
原理説明
最初に user_id と id で並べ替え、次に 1 から始まるシリアル番号を割り当てると、同じユーザーが増加、別のユーザー 次に、1 からやり直します。