[MySQL]分组排序取前N条记录以及生成自动数字序列,类似groupby后limit_MySQL
同事的业务场景是,按照cid、author分组,再按照id倒叙,取出前2条记录出来。
oracle里面可以通过row_number() OVER (PARTITION BY cid,author ORDER BY id DESC) 表示根据cid,author分组,在分组内部根据id排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的),而mysql数据库就没有这样的统计函数,需要自己写复杂的sql来实现。
1,录入测试数据
USE csdn;
DROP TABLE IF EXISTS test;
CREATE TABLE test (
id INT PRIMARY KEY,
cid INT,
author VARCHAR(30)
) ENGINE=INNODB;
INSERT INTO test VALUES
(1,1,\'test1\'),
(2,1,\'test1\'),
(3,1,\'test2\'),
(4,1,\'test2\'),
(5,1,\'test2\'),
(6,1,\'test3\'),
(7,1,\'test3\'),
(8,1,\'test3\'),
(9,1,\'test3\'),
(10,2,\'test11\'),
(11,2,\'test11\'),
(12,2,\'test22\'),
(13,2,\'test22\'),
(14,2,\'test22\'),
(15,2,\'test33\'),
(16,2,\'test33\'),
(17,2,\'test33\'),
(18,2,\'test33\');
INSERT INTO test VALUES (200,200,\'200test_nagios\');
2,原始的效率比较低下的子查询实现方式
SELECT * FROM test a
WHERE
N>(
SELECT COUNT(*)
FROM test b
WHERE a.cid=b.cid AND a.`author`=b.`author` AND a.id
只要将N换成你要的数字比如2,就表示查询出每个分组的前2条记录,如下所示:
mysql> SELECT * FROM test a
-> WHERE
-> 2>(
-> SELECT COUNT(*)
-> FROM test b
-> WHERE a.cid=b.cid AND a.`author`=b.`author` AND a.id
+-----+------+----------------+
| id | cid | author |
+-----+------+----------------+
| 2 | 1 | test1 |
| 1 | 1 | test1 |
| 5 | 1 | test2 |
| 4 | 1 | test2 |
| 9 | 1 | test3 |
| 8 | 1 | test3 |
| 11 | 2 | test11 |
| 10 | 2 | test11 |
| 14 | 2 | test22 |
| 13 | 2 | test22 |
| 18 | 2 | test33 |
| 17 | 2 | test33 |
| 200 | 200 | 200test_nagios |
+-----+------+----------------+
13 ROWS IN SET (0.00 sec)
mysql>
3,使用动态sql来实现
先构造序列号码,引入一个@row来做rownumber
SET @row=0;SET @mid='';SELECT cid, author, @row:=@row+1 rownum FROM test ORDER BY cid, author LIMIT 10;
序列号码已经出来了,再加一个@mid来进行分组,重点在于CASE WHEN @mid = author THEN @row:=@row+1 ELSE @row:=1 END rownum,表示分组的时候会自动从1计数指导这个分组数据遍历结束。
好了,再外面加一层inner JOIN 再对 rownumber 做限制 就可以拿到目标数据了。
SET @row=0;
执行结果如下所示:
mysql> SET @row=0;
QUERY OK, 0 ROWS affected (0.00 sec)
mysql> SET @mid=\'\';
QUERY OK, 0 ROWS affected (0.00 sec)
mysql> SELECT a.*,b.rownum FROM test a
-> INNER JOIN (
-> SELECT cid, author, id, CASE WHEN @mid = author THEN @row:=@row+1 ELSE @row:=1 END rownum, @mid:=author MID
-> FROM test
-> ORDER BY cid,author,id DESC
-> ) b ON b.author=a.author AND b.cid=a.cid AND b.id=a.id WHERE b.rownum +-----+------+----------------+--------+
| id | cid | author | rownum |
+-----+------+----------------+--------+
| 2 | 1 | test1 | 1 |
| 1 | 1 | test1 | 2 |
| 5 | 1 | test2 | 1 |
| 4 | 1 | test2 | 2 |
| 9 | 1 | test3 | 1 |
| 8 | 1 | test3 | 2 |
| 11 | 2 | test11 | 1 |
| 10 | 2 | test11 | 2 |
| 14 | 2 | test22 | 1 |
| 13 | 2 | test22 | 2 |
| 18 | 2 | test33 | 1 |
| 17 | 2 | test33 | 2 |
| 200 | 200 | 200test_nagios | 1 |
+-----+------+----------------+--------+
13 ROWS IN SET (0.01 sec)
mysql>
参考文章地址:
http://blog.csdn.net/mchdba/article/details/22163223

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Standby ist ein Sperrbildschirmmodus, der aktiviert wird, wenn das iPhone an das Ladegerät angeschlossen und horizontal (oder im Querformat) ausgerichtet ist. Es besteht aus drei verschiedenen Bildschirmen, von denen einer im Vollbildmodus angezeigt wird. Lesen Sie weiter, um zu erfahren, wie Sie den Stil Ihrer Uhr ändern können. Auf dem dritten Bildschirm von StandBy werden Uhrzeiten und Daten in verschiedenen Themen angezeigt, die Sie vertikal wischen können. Einige Themes zeigen auch zusätzliche Informationen an, wie z. B. Temperatur oder nächster Alarm. Wenn Sie eine beliebige Uhr gedrückt halten, können Sie zwischen verschiedenen Themen wechseln, darunter Digital, Analog, Welt, Solar und Floating. Float zeigt die Zeit in großen Blasenzahlen in anpassbaren Farben an, Solar verfügt über eine Standardschriftart mit einem Sonneneruptionsdesign in verschiedenen Farben und World zeigt die Welt durch Hervorhebung an

Die Möglichkeit, Zufallszahlen oder alphanumerische Zeichenfolgen zu generieren, ist in vielen Situationen praktisch. Sie können damit an verschiedenen Orten im Spiel Feinde oder Nahrung hervorbringen. Sie können es auch verwenden, um Benutzern zufällige Passwörter vorzuschlagen oder Dateinamen zum Speichern von Dateien zu erstellen. Ich habe ein Tutorial darüber geschrieben, wie man in PHP zufällige alphanumerische Zeichenfolgen generiert. Ich habe am Anfang dieses Beitrags gesagt, dass nur wenige Ereignisse wirklich zufällig sind, und das Gleiche gilt für die Zufallszahlen- oder String-Generierung. In diesem Tutorial zeige ich Ihnen, wie Sie in JavaScript eine pseudozufällige alphanumerische Zeichenfolge generieren. Generieren von Zufallszahlen in JavaScript Beginnen wir mit der Generierung von Zufallszahlen. Die erste Methode, die mir in den Sinn kommt, ist Math.random(), die einen Float zurückgibt

Zahlen als Ausgabe darzustellen ist eine interessante und wichtige Aufgabe beim Schreiben eines Programms in einer beliebigen Sprache. Bei ganzzahligen Typen (Daten vom Typ kurz, lang oder mittel) ist es einfach, Zahlen als Ausgabe darzustellen. Bei Gleitkommazahlen (Float- oder Double-Typ) müssen wir sie manchmal auf eine bestimmte Anzahl von Dezimalstellen runden. Wenn wir beispielsweise 52,24568 mit drei Dezimalstellen darstellen möchten, ist eine gewisse Vorverarbeitung erforderlich. In diesem Artikel stellen wir verschiedene Techniken vor, um Gleitkommazahlen durch Runden auf eine bestimmte Anzahl von Dezimalstellen darzustellen. Unter den verschiedenen Ansätzen ist es wichtig, eine C-ähnliche Formatzeichenfolge zu verwenden, das Präzisionsargument zu verwenden und die Funktion „round()“ aus der Mathematikbibliothek zu verwenden. Schauen wir sie uns einzeln an. mit

In diesem Artikel werden wir das Problem diskutieren, Zahlen zwischen 1 und n (vorgegeben) zu finden, die nicht durch eine Zahl zwischen 2 und 10 teilbar sind. Lassen Sie uns dies anhand einiger Beispiele verstehen: Eingabe: Nummer = 14 Ausgabe: 3 Erläuterung: Es gibt drei Zahlen, 1, 11 und 13, die nicht teilbar sind. Eingabe: Nummer = 21 Ausgabe: 5 Erläuterung: Es gibt fünf Zahlen 1, 11, 13, 17 und 19, die nicht teilbar sind

Wir alle kennen Zahlen, die nicht das Quadrat einer Zahl sind, wie zum Beispiel 2, 3, 5, 7, 8 usw. Es gibt N nichtquadratische Zahlen und es ist unmöglich, jede Zahl zu kennen. In diesem Artikel erklären wir alles über quadratlose oder nichtquadratische Zahlen und Möglichkeiten, die N-te nichtquadratische Zahl in C++ zu finden. N-te nichtquadratische Zahl Wenn eine Zahl das Quadrat einer ganzen Zahl ist, wird die Zahl als perfektes Quadrat bezeichnet. Einige Beispiele für perfekte Quadratzahlen sind -1isquadratvon14isquadratvon29isquadratvon316isquadratvon425isquadratvon5. Wenn eine Zahl nicht das Quadrat einer ganzen Zahl ist, wird die Zahl als nichtquadratisch bezeichnet. Die ersten 15 nichtquadratischen Zahlen sind beispielsweise -2,3,5,6,

Zahlen in Java Es ist wichtig zu verstehen, dass die Zahlenklasse keine greifbare Klasse, sondern eine abstrakte Klasse ist. Darin befindet sich eine Reihe von Wrapper-Klassen, die seine Funktionalität definieren. Zu diesen Wrapper-Klassen gehören Integer, Byte, Double, Short, Float und Long. Möglicherweise stellen Sie fest, dass es sich dabei um dieselben grundlegenden Datentypen handelt, die wir zuvor besprochen haben, sie werden jedoch als separate Klassen mit Großbuchstaben dargestellt, um der Klassenbenennungskonvention zu entsprechen. Der Compiler konvertiert automatisch primitive Datentypen in Objekte und umgekehrt, je nach Bedarf für eine bestimmte Funktion oder einen bestimmten Programmumfang. Numerische Klassen sind Teil des java.lang-Pakets. Dieser Vorgang wird Autoboxing und Unboxing genannt. Indem wir die abstrakte Natur numerischer Klassen und ihrer entsprechenden Wrapper-Klassen verstehen, können wir dies tun

In der Programmiersprache PHP ist die Funktion is_numeric() eine sehr häufig verwendete Funktion, mit der ermittelt wird, ob eine Variable oder ein Wert eine Zahl ist. Bei der tatsächlichen Programmierung ist es häufig erforderlich, den vom Benutzer eingegebenen Wert zu überprüfen, um festzustellen, ob es sich um einen numerischen Typ handelt. In diesem Fall kann die Funktion is_numeric() zur Bestimmung verwendet werden. 1. Einführung in die Funktion is_numeric() Die Funktion is_numeric() ist eine Funktion, die verwendet wird, um zu erkennen, ob eine Variable oder ein Wert eine Zahl ist. Gibt tru zurück, wenn die Variable oder der Wert eine Zahl ist

Besprechen Sie beispielsweise ein Problem: Wir müssen eine gegebene Zahl N in ihre maximalen Primzahlen aufteilen, eine Primzahl von N subtrahieren und dann die Differenz der Primzahlen überprüfen. Wenn die Differenz eine Primzahl ist, können wir N als Summe zweier Primzahlen ausdrücken. Aber hier müssen wir
