Heim >Datenbank >MySQL-Tutorial >MySQL – GROUP BY-Gruppierung, um den Maximalwert der Feldbeispielcodedetails zu erhalten

MySQL – GROUP BY-Gruppierung, um den Maximalwert der Feldbeispielcodedetails zu erhalten

黄舟
黄舟Original
2018-05-15 14:14:583373Durchsuche

MySQL – GRUPPE NACH Gruppierung von Beispielcodedetails, um den maximalen Feldwert zu erhalten:

Angenommen, es gibt ein Geschäftsszenario, in dem Benutzeranmeldedatensatzinformationen und die Tabellenstruktur abgefragt werden müssen lautet wie folgt:

CREATE TABLE `tb` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL,
  `ip` varchar(16) NOT NULL,
  `login_time` datetime,
  PRIMARY KEY (`id`),
  KEY (`uid`)
);

Lassen Sie uns weitere Testdaten erhalten:

INSERT INTO tb SELECT null, 1001, '192.168.1.1', '2017-01-21 16:30:47';
INSERT INTO tb SELECT null, 1003, '192.168.1.153', '2017-01-21 19:30:51';
INSERT INTO tb SELECT null, 1001, '192.168.1.61', '2017-01-21 16:50:41';
INSERT INTO tb SELECT null, 1002, '192.168.1.31', '2017-01-21 18:30:21';
INSERT INTO tb SELECT null, 1002, '192.168.1.66', '2017-01-21 19:12:32';
INSERT INTO tb SELECT null, 1001, '192.168.1.81', '2017-01-21 19:53:09';
INSERT INTO tb SELECT null, 1001, '192.168.1.231', '2017-01-21 19:55:34';

Tabellendaten:

+----+------+---------------+---------------------+
| id | uid  | ip            | login_time          |
+----+------+---------------+---------------------+
| 1  | 1001 | 192.168.1.1   | 2017-01-21 16:30:47 |
| 2  | 1003 | 192.168.1.153 | 2017-01-21 19:30:51 |
| 3  | 1001 | 192.168.1.61  | 2017-01-21 16:50:41 |
| 4  | 1002 | 192.168.1.31  | 2017-01-21 18:30:21 |
| 5  | 1002 | 192.168.1.66  | 2017-01-21 19:12:32 |
| 6  | 1001 | 192.168.1.81  | 2017-01-21 19:53:09 |
| 7  | 1001 | 192.168.1.231 | 2017-01-21 19:55:34 |
+----+------+---------------+---------------------+

Wenn Sie nur suchen müssen Um die letzte Anmeldezeit eines Benutzers herauszufinden, können Sie einfach schreiben:

SELECT uid, max(login_time)
FROM tb
GROUP BY uid;
+------+---------------------+
| uid  | max(login_time)       |
+------+---------------------+
| 1001 | 2017-01-21 19:55:34 |
| 1002 | 2017-01-21 19:12:32 |
| 1003 | 2017-01-21 19:30:51 |
+------+---------------------+

Wenn Sie auch andere Informationen über die letzte Anmeldung des Benutzers abfragen müssen, können Sie diese SQL nicht zum Schreiben verwenden :

-- 错误写法
SELECT uid, ip, max(login_time)
FROM tb
GROUP BY uid;
-- 错误写法

Eine solche Anweisung ist kein SQL-Standard. Obwohl sie erfolgreich in der MySQL-Datenbank ausgeführt werden kann, ist der zurückgegebene Wert unbekannt
(Wenn sql_mode nur_full_group_by aktiviert ist, ist dies der Fall wird nicht erfolgreich ausgeführt.)

<br/>

Vielleicht nimmt das IP-Feld den Wert der ersten Zeile vor der UID-Gruppe an, was offensichtlich nicht den erforderlichen Informationen entspricht
Schreibmethode 1
Schreiben Sie eine Unterabfrage:

SELECT a.uid, a.ip, a.login_time
FROM tb a
WHERE a.login_time in (
SELECT max(login_time)
FROM tb
GROUP BY uid);

Schreibmethode 2
Oder ändern Sie die Schreibmethode:

SELECT a.uid, a.ip, a.login_time
FROM tb a
WHERE a.login_time = (
SELECT max(login_time)
FROM tb
WHERE a.uid = uid);

Übrigens habe ich es getestet
In Versionen vor 5.6 wird die Schreibmethode ② Diese SQL wird ausgeführt, wenn eine große Datenmenge vorhanden ist. Schlechte Planung und schlechte visuelle Leistung.
In den Versionen 5.6 und höher wird das Schreiben ② dieses SQL viel schneller sein, und der Ausführungsplan hat sich ebenfalls geändert
5.5.50:

+----+--------------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type        | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+--------------------+-------+------+---------------+------+---------+------+------+-------------+
| 1  | PRIMARY            | a     | ALL  | NULL             | NULL  | NULL      | NULL | 7    | Using where |
| 2  | DEPENDENT SUBQUERY | tb    | ALL  | uid           | NULL  | NULL      | NULL | 7    | Using where |
+----+--------------------+-------+------+---------------+------+---------+------+------+-------------+

5.6.30:

+----+--------------------+-------+------+---------------+------+---------+------------+------+-------------+
| id | select_type        | table  | type | possible_keys | key  | key_len | ref       | rows  | Extra      |
+----+--------------------+-------+------+---------------+------+---------+------------+------+-------------+
| 1  | PRIMARY            | a     | ALL  | NULL              | NULL | NULL      | NULL        | 7    | Using where |
| 2  | DEPENDENT SUBQUERY | tb    | ref  | uid           | uid  | 4       | test.a.uid | 1    | NULL           |
+----+--------------------+-------+------+---------------+------+---------+------------+------+-------------+

Schreiben 3
Die Leistung wird besser, wenn Sie es direkt ändern, um beizutreten:

SELECT a.uid, a.ip, a.login_time
FROM (SELECT uid, max(login_time) login_time
FROM tb
GROUP BY uid
) b JOIN tb a ON a.uid = b.uid AND a.login_time = b.login_time;

Natürlich sind die Ergebnisse die gleichen:

+------+---------------+---------------------+
| uid  | ip            | login_time          |
+------+---------------+---------------------+
| 1003 | 192.168.1.153 | 2017-01-21 19:30:51 |
| 1002 | 192.168.1.66  | 2017-01-21 19:12:32 |
| 1001 | 192.168.1.231 | 2017-01-21 19:55:34 |
+------+---------------+---------------------+

Hinweis: Wenn Sie den Mindestwert gruppieren möchten, ändern Sie einfach die entsprechende Funktion und das entsprechende Symbol.


Das obige ist der detaillierte Inhalt vonMySQL – GROUP BY-Gruppierung, um den Maximalwert der Feldbeispielcodedetails zu erhalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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