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

高洛峰
Freigeben: 2016-11-22 10:47:24
Original
1280 Leute haben es durchsucht

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;
Nach dem Login kopieren

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 |
+----+--------+----------------------------------+
Nach dem Login kopieren

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 |
+----+--------+----------------------------------+
Nach dem Login kopieren

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 |
Nach dem Login kopieren

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.


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage