Heim >Datenbank >MySQL-Tutorial >So erhalten Sie den N-ten Datensatz in jeder Gruppe in MySQL

So erhalten Sie den N-ten Datensatz in jeder Gruppe in MySQL

高洛峰
高洛峰Original
2016-11-22 10:47:241321Durchsuche

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')?

So erhalten Sie den N-ten Datensatz in jeder Gruppe in MySQL

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.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn