Heim > Datenbank > MySQL-Tutorial > Hauptteil

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

黄舟
Freigeben: 2018-05-15 14:14:58
Original
3358 Leute haben es durchsucht

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

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

Tabellendaten: <br/>

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

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

SELECT uid, max(login_time)
FROM tb
GROUP BY uid;
Nach dem Login kopieren
+------+---------------------+
| 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 |
+------+---------------------+
Nach dem Login kopieren

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

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

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

<br/>
Nach dem Login kopieren

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

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

Schreibmethode 2<br/> Oder ändern Sie die Schreibmethode: <br/>

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

Übrigens habe ich es getestet <br/> 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. <br/>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 <br/>5.5.50: <br/>

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

5.6.30: <br/>

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

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

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

Natürlich sind die Ergebnisse die gleichen:<br/>

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

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!

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