Problemhintergrund
1) Einschränkungen: Jeder Benutzer kann maximal 4 kostenlose Bestellungen für eine Kategorie genießen.
Das heißt, wenn die Anzahl der Bestellungen gezählt wird, die den kostenlosen Versandrabatt in Anspruch genommen haben, müssen Bestellungen, die nach der vierten Bestellung in derselben Kategorie aufgegeben werden, ausgeschlossen werden.
So erhalten Sie die ID des Vierte Bestellung jedes Benutzers in derselben Kategorie?
select fourth(id) from order group by user_id, category;
Leider verfügt MySQL nicht über eine Gruppierungsfunktion, um problemlos die vierte ID in jeder Gruppe zu erhalten. Es kann jedoch Abhilfemaßnahmen geben, wenn es beispielsweise die folgende Tabelle gibt:
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 | +----+--------+----------------------------------+
Wie erhalte ich die Reihenfolge der zweiten erfolgreichen Zahlung jedes Benutzers (Status='10')?
Methode 1 – Einzelabfrage
select * from t where user_id = '24e568a88fae11e6bb0650b497d97cdd' and status = '10' order by id limit 1,1; +----+--------+----------------------------------+ | id | status | user_id | +----+--------+----------------------------------+ | 2 | 10 | 24e568a88fae11e6bb0650b497d97cdd | +----+--------+----------------------------------+
Option 2 – Einmalige Abfrage
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 |
Grundsatzerklärung
Sortieren Sie zuerst nach Benutzer-ID und ID und weisen Sie dann Seriennummern beginnend bei 1 zu. Derselbe Benutzer wird erhöht, und verschiedene Benutzer beginnen wieder bei 1.