Heim > php教程 > PHP开发 > Verwenden von „group by' in Sequelize, um eine Gruppenaggregationsabfrage durchzuführen

Verwenden von „group by' in Sequelize, um eine Gruppenaggregationsabfrage durchzuführen

高洛峰
Freigeben: 2016-12-28 11:30:46
Original
3164 Leute haben es durchsucht

1. Gruppenabfrage in SQL und Sequelize

1.1 Gruppenabfrage in SQL

In der SQL-Abfrage wird die Gruppenabfrage über den GROUP BY-Sprachnamen implementiert. Die GROUP BY-Klausel muss in Verbindung mit einer Aggregatfunktion verwendet werden, um die Gruppenabfrage abzuschließen. Wenn in den Feldern der SELECT-Abfrage keine Aggregatfunktion verwendet wird, muss diese in der ORDER BY-Klausel erscheinen. Nach dem Gruppieren der Abfrage ist das Abfrageergebnis eine nach einer oder mehreren Spalten gruppierte Ergebnismenge.

GROUP BY-Syntax

SELECT 列名, 聚合函数(列名)
FROM 表名
WHERE 列名 operator value
GROUP BY 列名 
[HAVING 条件表达式] [WITH ROLLUP]
Nach dem Login kopieren

In der obigen Aussage:

Aggregationsfunktion – Gruppierungsabfragen werden normalerweise mit Aggregatfunktionen verwendet, zu denen Folgendes gehört:

COUNT() – wird verwendet, um die Anzahl der Datensätze zu zählen

SUM() – wird verwendet, um die Summe der Feldwerte zu berechnen

AVG() – wird verwendet, um den Durchschnittswert von Feldern zu berechnen

MAX – wird verwendet, um den maximalen Wert des Abfragefelds zu ermitteln.

MIX – wird verwendet, um den minimalen Wert des Abfragefelds zu ermitteln.

GROUP BY subname – wird verwendet, um den anzugeben Gruppenfeld

HAVING subname – wird zum Filtern von Gruppierungsergebnissen verwendet. Ergebnisse, die dem bedingten Ausdruck entsprechen, werden angezeigt

MIT ROLLUP subname – wird verwendet, um anzugeben, dass ein Datensatz angehängt werden soll. Wird verwendet, um die vorherigen Daten zusammenzufassen

1.2 Gruppenabfrage in Sequelize

Aggregatfunktionen verwenden

Sequelize bietet Aggregatfunktionen, mit denen Aggregatabfragen direkt am Modell durchgeführt werden können :

aggregate(field,aggregatFunction, [options]) – Abfrage nach der angegebenen Aggregatfunktion

sum(field, [options]) – Summe

count( field, [options ])-Anzahl der statistischen Abfrageergebnisse

max(field, [Optionen])-Fragen Sie den Maximalwert ab

min(field, [Optionen])-Fragen Sie den Minimalwert ab

Unter den oben genannten Aggregatfunktionen können Sie gruppierungsbezogene Felder über die Attribute „options.attributes“ und „options.attributes“ angeben, und Sie können Filterbedingungen über „options.having“ angeben, es gibt jedoch keine direkte Spezifikation der Parameter WITH ROLLUP-Klausel.

Verwenden Sie beispielsweise .sum(), um die Bestellmenge von Benutzern abzufragen, deren Bestellmenge größer als 1 ist:

Order.sum('price', {attributes:['name'], group:'name', plain:false, having:['COUNT(?)>?', 'name', 1]}).then(function(result){
 console.log(result);
})
Nach dem Login kopieren

Die generierte SQL-Anweisung lautet wie folgt:

SELECT `name`, sum(`price`) AS `sum` FROM `orders` AS `Orders` GROUP BY name HAVING COUNT('name')>1;
Nach dem Login kopieren
Nach dem Login kopieren

Aggregatparameter verwenden

Zusätzlich zur direkten Verwendung von Aggregatfunktionen können Sie auch aggregationsabfragebezogene Parameter in Methoden wie findAll() angeben, um Aggregationsabfragen zu implementieren. Bei der Abfrage können Sie auch die Gruppierung verwandter Felder über die Attribute „options.attributes“ und „options.attributes“ angeben und Sie können Filterbedingungen über „options.having“ angeben. Anders als bei der direkten Verwendung von Aggregatfunktionsabfragen müssen beim Erstellen einer Aggregatabfrage über Parameter die Aggregatfelder im Parameter „options.attributes“ in Form eines Arrays oder Objekts festgelegt werden und die Aggregatfunktion muss über sequelize.fn übergeben werden ()-Methode.

Verwenden Sie beispielsweise .findAll(), um die Bestellmenge von Benutzern abzufragen, deren Bestellmenge größer als 1 ist:

Order.findAll({attributes:['name', [sequelize.fn('SUM', sequelize.col('price')), 'sum']], group:'name', having:['COUNT(?)>?', 'name', 1], raw:true}).then(function(result){
 console.log(result);
})
Nach dem Login kopieren

Die generierte SQL-Anweisung lautet wie folgt:

SELECT `name`, sum(`price`) AS `sum` FROM `orders` AS `Orders` GROUP BY name HAVING COUNT('name')>1;
Nach dem Login kopieren
Nach dem Login kopieren

2. Anwendungsbeispiel

Jetzt die Bestelltabelle, die Daten lauten wie folgt:

> select * from orders;
+---------+-------------+--------+-----------+---------------------+
| orderId | orderNumber | price | name  | createdOn   |
+---------+-------------+--------+-----------+---------------------+
|  1 | 00001  | 128.00 | 张小三 | 2016-11-25 10:12:49 |
|  2 | 00002  | 102.00 | 张小三 | 2016-11-25 10:12:49 |
|  4 | 00004  | 99.00 | 王小五 | 2016-11-25 10:12:49 |
|  3 | 00003  | 199.00 | 赵小六 | 2016-11-25 10:12:49 |
+---------+-------------+--------+-----------+---------------------+
Nach dem Login kopieren

2.1 Einfache Verwendung

Verwenden Sie die Gruppenabfrage, um die Gesamtbestellmenge jedes Kunden zu zählen.

Mithilfe von SQL-Anweisungen können Sie wie folgt abfragen:

> select name, SUM(price) from orders GROUP BY name;
+-----------+------------+
| name  | SUM(price) |
+-----------+------------+
| 张小三 |  230.00 |
| 王小五 |  99.00 |
| 赵小六 |  199.00 |
+-----------+------------+
Nach dem Login kopieren

In Sequelize können Sie wie folgt abfragen:

Order.findAll({attributes:['sum', [sequelize.fn('SUM', sequelize.col('name')), 'sum']], group:'name', raw:true}).then(function(result){
 console.log(result);
})
Nach dem Login kopieren

2.2 Verwenden Sie die HAVING-Klausel

, um die Gesamtbestellmenge von Benutzern zu zählen, deren Bestellmenge größer als 1 ist.

Mithilfe von SQL-Anweisungen kann es wie folgt implementiert werden:

> select name, SUM(price) from orders GROUP BY name HAVING count(1)>1;
+-----------+------------+
| name  | SUM(price) |
+-----------+------------+
| 张小三 |  230.00 |
| 赵小六 |  199.00 |
+-----------+------------+
Nach dem Login kopieren

Und mit Sequelize kann es wie folgt abgefragt werden:

Order.findAll({attributes:['sum', [sequelize.fn('SUM', sequelize.col('name')), 'sum']], group:'name', having:['COUNT(?)>?', 'name', 1], raw:true}).then(function(result){
 console.log(result);
})
Nach dem Login kopieren

2.3 Verwendung der WITH ROLLUP-Klausel

WITH ROLLUP-Klausel ist eine neue Funktion von MySQL 5.5+, die zusammenfassend verwendet wird statistische Ergebnisse. Zum Zeitpunkt der Veröffentlichung dieses Artikels unterstützt Sequelize diese Funktion jedoch noch nicht.

Gesamtstatistikspalte hinzufügen:

> select name, SUM(price) from orders GROUP BY name WITH ROLLUP;
+-----------+------------+
| name  | SUM(price) |
+-----------+------------+
| 张小三 |  230.00 |
| 王小五 |  99.00 |
| 赵小六 |  199.00 |
| NULL  |  528.00 |
+-----------+------------+
Nach dem Login kopieren

2.4 Verbindungsabfrage und Gruppierung

Zur Vereinfachung Management, Wir werden verschiedene Informationen in verschiedenen Tabellen speichern. Beispielsweise würden wir Bestellinformationen in einer Tabelle und Kundeninformationen in einer anderen Tabelle ablegen. Für zwei miteinander verbundene Tabellen verwenden wir Join-Abfragen, um verwandte Daten zu finden. Bei der Durchführung von Join-Abfragen können wir auch Aggregatfunktionen verwenden.

Die Bestelltabelle ist wie folgt:

> select * from orders;
+---------+-------------+--------+------------+---------------------+
| orderId | orderNumber | price | customerId | createdOn   |
+---------+-------------+--------+------------+---------------------+
|  1 | 00001  | 128.00 |   1 | 2016-11-25 10:12:49 |
|  2 | 00002  | 102.00 |   1 | 2016-11-25 10:12:49 |
|  3 | 00003  | 199.00 |   4 | 2016-11-25 10:12:49 |
|  4 | 00004  | 99.00 |   3 | 2016-11-25 10:12:49 |
+---------+-------------+--------+------------+---------------------+
Nach dem Login kopieren

Die Kundentabellenstruktur ist wie folgt:

> select * from customers;
+----+-----------+-----+---------------------+---------------------+
| id | name  | sex | birthday   | createdOn   |
+----+-----------+-----+---------------------+---------------------+
| 1 | 张小三 | 1 | 1986-01-22 08:00:00 | 2016-11-25 10:16:35 |
| 2 | 李小四 | 2 | 1987-11-12 08:00:00 | 2016-11-25 10:16:35 |
| 3 | 王小五 | 1 | 1988-03-08 08:00:00 | 2016-11-25 10:16:35 |
| 4 | 赵小六 | 1 | 1989-08-11 08:00:00 | 2016-11-25 10:16:35 |
+----+-----------+-----+---------------------+---------------------+
Nach dem Login kopieren

Verwenden Sie die Join-Abfrage und die Gruppenabfrage, um die Gesamtbestellmenge jedes Kunden zu zählen.

Verwenden Sie die SQL-Anweisung zur Abfrage wie folgt:

> select c.name, SUM(o.price) AS sum from customers AS c INNER JOIN orders AS o ON o.customerId =c.id GROUP BY c.name;
Nach dem Login kopieren

Wenn Sie eine Verbindungsabfrage in Sequelize durchführen, müssen Sie zunächst die Zuordnung herstellen zwischen Modellen:

Order.belongsTo(Customer, {foreignKey: 'customerId'});
Nach dem Login kopieren

Verbindungsabfrage und Gruppierung:

var include = [{
 model: Customer,
 required: true,
 attributes: ['name'],
}]
Order.findAll({include:include, attributes:[[sequelize.fn('SUM', sequelize.col('price')), 'sum']], group:'Customer.name', having:['COUNT(?)>?', 'name', 1], raw:true, rollup:true}).then(function(result){
 console.log(result);
})
Nach dem Login kopieren

Zusammenfassung

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels für alle beim Lernen oder bei der Arbeit hilfreich sein kann. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen.

Weitere Artikel zur Verwendung von „group by“ zur Durchführung einer Gruppenaggregationsabfrage in Sequelize finden Sie auf der chinesischen PHP-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 Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage