MySql-Gruppierung und zufälliges Abrufen eines Datenelements aus jeder Gruppe

MySql-Gruppierung und zufälliges Abrufen eines Datenelements aus jeder Gruppe

Idee: Einfach erst zufällig sortieren und dann gruppieren.

1. Erstellen Sie eine Tabelle:

Tabelle „xdx_test“ erstellen (
 `id` int(11) NICHT NULL,
 `name` varchar(255) DEFAULT NULL,
 `Klasse` varchar(255) DEFAULT NULL,
 PRIMÄRSCHLÜSSEL (`id`)
)ENGINE=InnoDB STANDARD-CHARSET=utf8mb4;

2. Daten einfügen

INSERT INTO xdx_test VALUES (1, 'Einfügen -1', '1');
INSERT INTO xdx_test VALUES (2, 'Li Si-1', '1');
INSERT INTO xdx_test VALUES (3, 'Fehler-1', '1');
INSERT INTO xdx_test VALUES (4, 'Werte -2', '2');
INSERT INTO xdx_test VALUES (5, 'Li Si-2', '2');
INSERT INTO xdx_test VALUES (6, 'Fehler -2', '2');
INSERT INTO xdx_test VALUES (7, 'Werte -3', '3');
INSERT INTO xdx_test VALUES (8, 'Li Si-3', '3');
INSERT INTO xdx_test VALUES (9, 'Fehler-3', '3');

3. Abfrageanweisung

WÄHLEN SIE * AUS 
 (SELECT * FROM xdx_test ORDER BY RAND()) ein
GROUP BY eine Klasse

4. Abfrageergebnisse

3 Wang Wu-1 1

5 Li Si-2 2

9 Wang Wu-3 3

3 Wang Wu-1 1

4 Zhang San-2 2

7 Zhang San-3 3

2 Li Si-1 1

5 Li Si-2 2

8 Li Si-3 3

Zusatzwissen: MySQL implementiert eine Methode zum zufälligen Abrufen mehrerer Daten (Vergleich von Effizienz und diskretem Typ)

Es gibt mehrere Möglichkeiten, SQL-Anweisungen zu schreiben, Effizienz und diskreten Vergleich

1: SELECT * FROM tablename ORDER BY RAND() LIMIT die Anzahl der Dateneinträge, die Sie erhalten möchten;

2: SELECT *FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT die Anzahl der Datenelemente, die Sie erhalten möchten;

3: Wählen Sie * aus „Tabelle“ als t1 aus. Verbinden Sie (wählen Sie Runden (Rand() * (wählen Sie Max (ID) aus „Tabelle“)) als ID) als t2, wobei t1.id >= t2.id

ORDER BY t1.id ASC LIMIT Die Anzahl der Datenelemente, die Sie erhalten möchten;

4: SELECT * FROM `table`WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) ORDER BY id LIMIT die Anzahl der Datenelemente, die Sie erhalten möchten;

5: SELECT * FROM `table` WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`))) ORDER BY id LIMIT die Anzahl der Datenelemente, die Sie erhalten möchten;

6: SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT die Anzahl der Datenelemente, die Sie erhalten möchten;

Die Abfragezeit von 1 >> die Abfragezeit von 2 >> die Abfragezeit von 5 > die Abfragezeit von 6 > die Abfragezeit von 4 > die Abfragezeit von 3, was bedeutet, dass 3 die höchste Effizienz hat.

Die oben genannten sechs Typen werden lediglich hinsichtlich ihrer Effizienz verglichen.

Die oben genannten 6 Arten der Zufallszahlenextraktion können in 2 Kategorien unterteilt werden:

Die erste weist eine höhere Diskretheit, aber eine geringe Effizienz auf; die anderen fünf weisen eine hohe Effizienz, aber eine geringe Diskretheit auf.

Wie lässt sich das Problem so lösen, dass sowohl Effizienz als auch Diskretheit gewährleistet sind?

Wir haben eine Idee: Schreiben Sie eine gespeicherte Prozedur;

Wählen Sie * FROM Test t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM Test)-(SELECT MIN(id) FROM Test)) + (SELECT MIN(id) FROM Test)) AS id) t2, wobei t1.id >= t2.id Grenze 1

Nehmen Sie jeweils einen Datensatz heraus und schreiben Sie ihn dann in einer Schleife in eine temporäre Tabelle. Kehren Sie schließlich zurück, um die temporäre Tabelle auszuwählen, und alles ist in Ordnung.

Dadurch wird nicht nur die Effizienzanforderung erfüllt, sondern auch das diskrete Problem gelöst; es können die Vorteile beider kombiniert werden.

Nachfolgend sehen Sie den Pseudocode der jeweiligen gespeicherten Prozedur

VERFAHREN LÖSCHEN, WENN `evaluate_Check_procedure` EXISTIERT;
TRENNUNGSZEICHEN ;;
CREATE DEFINER=`root`@`%` PROCEDURE `Prüfprozedur_auswerten`(IN startTime datetime, IN endTime datetime, IN checkNum INT, IN evaInterface VARCHAR(36))
BEGINNEN

-- Erstellen Sie eine temporäre Tabelle zum Speichern zufällig abgerufener Daten

temporäre Tabelle erstellen, falls nicht vorhanden xdr_authen_tmp ( 
 `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Seriennummer',
 `LENGTH` int(5) DEFAULT NULL COMMENT 'Anzahl der Bytes',
 `INTERFACE` int(3) NOT NULL KOMMENTAR 'Schnittstelle',
 `XDR_ID` varchar(32) NICHT NULL KOMMENTAR 'XDR ID',
 `MSISDN` varchar(32) DEFAULT NULL COMMENT 'Benutzernummer',
 `PROCEDURE_START_TIME` datetime NICHT NULL STANDARD '0000-00-00 00:00:00' KOMMENTAR 'Startzeit',
 `PROCEDURE_END_TIME` datetime DEFAULT NULL COMMENT 'Endzeit',
 `SOURCE_NE_IP` varchar(39) DEFAULT NULL COMMENT 'Quelle NE IP',
 `SOURCE_NE_PORT` int(5) DEFAULT NULL COMMENT 'Quell-NE-Port',
 `DESTINATION_NE_IP` varchar(39) DEFAULT NULL COMMENT 'IP des Zielnetzwerkelements',
 `DESTINATION_NE_PORT` int(5) DEFAULT NULL COMMENT 'Ziel-Netzwerkelement-Port',
 `INSERT_DATE` datetime DEFAULT NULL COMMENT 'Zeit einfügen',
 `EXTEND1` varchar(50) DEFAULT NULL COMMENT 'Erweiterung 1',
 `EXTEND2` varchar(50) DEFAULT NULL COMMENT 'Erweiterung 2',
 `EXTEND3` varchar(50) DEFAULT NULL COMMENT 'Erweiterung 3',
 `EXTEND4` varchar(50) DEFAULT NULL COMMENT 'Erweiterung 4',
 `EXTEND5` varchar(50) DEFAULT NULL COMMENT 'Erweiterung 5',
 PRIMÄRSCHLÜSSEL (`ID`,`PROCEDURE_START_TIME`),
 SCHLÜSSEL `index_procedure_start_time` (`PROCEDURE_START_TIME`),
 SCHLÜSSEL `index_source_dest_ip` (`SOURCE_NE_IP`,`DESTINATION_NE_IP`),
 SCHLÜSSEL `index_xdr_id` (`XDR_ID`) 
)ENGINE = InnoDB STANDARD-ZEICHENSATZ = utf8;

BEGINNEN
Erklären Sie j INT;
Erklären Sie, dass ich INT;

DECLARE CONTINUE HANDLER FÜR NICHT GEFUNDENES SET i = 1;

-- checkNum ist hier die Anzahl der Daten, die zufällig abgerufen werden sollen. Wenn beispielsweise 10 Datensätze zufällig abgerufen werden sollen, ist es hier 10. Die while-Schleife wird verwendet, um einzelne zufällige Datensätze nacheinander abzurufen.

Setze j = 0;
WHILE j < Prüfzahl DO 
 set @sqlexi = concat( ' SELECT t1.ID,t1.LENGTH,t1.LOCAL_PROVINCE,t1.LOCAL_CITY,t1.OWNER_PROVINCE,t1.OWNER_CITY,t1.ROAMING_TYPE,t1.INTERFACE,t1.XDR_ID,t1.RAT,t1.IMSI,t1.IMEI,t1.MSISDN,t1.PROCEDURE_START_TIME,t1.PROCEDURE_END_TIME,t1.TRANSACTION_TYPE,t1.TRANSACTION_STATUS,t1.SOURCE_NE_IP,t1.SOURCE_NE_PORT,t1.DESTINATION_NE_IP,t1.DESTINATION_NE_PORT,t1.RESULT_CODE,t1.EXPERIMENTAL_RESULT_CODE,t1.ORIGIN_REALM,t1.DESTINATION_REALM,t1.ORIGIN_HOST,t1.DESTINATION_HOST,t1.INSERT_DATE',
    ' in @ID,@LÄNGE,@LOKALE_PROVINZ,@LOKALE_STADT,@EIGENTÜMER_PROVINZ,@EIGENTÜMER_STADT,@ROAMING_TYP,@SCHNITTSTELLE,@XDR_ID,@RAT,@IMSI,@IMEI,@MSISDN,@STARTZEIT_DESTINATION_PROZESSES,@ENDZEIT_DESTINATION_PROZESSES,@TRANSAKTIONSTYP,@TRANSAKTIONSSTATUS,@QUELL_NE_IP,@QUELL_NE_PORT,@ZIEL_NE_IP,@ZIEL_NE_PORT,@ERGEBNISCODE,@EXPERIMENTELLES_ERGEBNISCODE,@URSPRUNGSBEREICH,@ZIEL_REALM,@URSPRUNGSHOST,@ZIEL_HOST,@DATUM_EINFÜGEN ',
    'VON xdr_authen t1 JOIN (AUSWÄHLEN ROUND(RAND() * ((AUSWÄHLEN MAX(id) VON xdr_authen)-(AUSWÄHLEN MIN(id) VON xdr_authen)) + (AUSWÄHLEN MIN(id) VON xdr_authen)) ALS id) t2',
    ' WHERE t1.PROCEDURE_START_TIME >= "',startTime,'"',
       ' UND t1.PROCEDURE_START_TIME < "',endTime,'"',' UND t1.INTERFACE IN (',evaInterface,')',
       ' und t1.id >= t2.id Limit 1');
 BEREITEN SIE sqlexi VON @sqlexi VOR;
 AUSFÜHREN sqlexi;
 DEALLOCATE PREPARE sqlexi;

-- Die hier erhaltenen Datensätze können wiederholt werden. Wenn es sich um doppelte Daten handelt, fügen wir diese Daten nicht in die temporäre Tabelle ein und erhalten beim nächsten Mal zufällige Daten. Und so weiter, bis genügend Zufallsdaten erhalten sind;

 Wähle count(1) in @num aus xdr_authen_tmp, wobei id = @ID;
 
 wenn @num > 0 oder i=1 dann 
  SETZE j = j;
 ANDERS
  einfügen in xdr_authen_tmp(ID,LÄNGE,LOKALE_PROVINZ,LOKALE_STADT,EIGENTÜMER_PROVINZ,EIGENTÜMER_STADT,ROAMING_TYP,SCHNITTSTELLE,XDR_ID,RAT,IMSI,IMEI,MSISDN,STARTZEIT_DES_VERFAHRENS,ENDZEIT_DES_VERFAHRENS,TRANSAKTIONSTYP,TRANSAKTIONSSTATUS,QUELLE_NE_IP,QUELLE_NE_PORT,ZIEL_NE_IP,ZIEL_NE_PORT,ERGEBNISCODE,EXPERIMENTELLES_ERGEBNISCODE,URSPRUNGSBEREICH,ZIEL_REIHENFOLGE,URSPRUNGSHOST,ZIEL_HOST,DATUM_EINFÜGEN)
  WERTE(@ID,@LÄNGE,@LOKALE_PROVINZ,@LOKALE_STADT,@EIGENTÜMER_PROVINZ,@EIGENTÜMER_STADT,@ROAMING-TYP,@SCHNITTSTELLE,@XDR_ID,@RAT,@IMSI,@IMEI,@MSISDN,@STARTZEIT_DES_VERFAHRENS,@ENDZEIT_DES_VERFAHRENS,@TRANSAKTIONSTYP,@TRANSAKTIONSSTATUS,@QUELL-NE-IP,@QUELL-NE-PORT,@ZIEL-NE-IP,@ZIEL-NE-PORT,@ERGEBNISCODE,@EXPERIMENTELLER_ERGEBNISCODE,@HERKUNFTSBEREICH,@ZIEL-REALM,@HERKUNFTS-HOST,@ZIEL-HOST,@DATUM_EINFÜGEN);
 
  Setze j = j + 1;
 Ende wenn; 
 Setze i = 0;

ENDE WÄHREND; 

-- Abschließend fragen wir alle Zufallszahlen ab und geben diese in Form eines Ergebnissatzes an das Backend zurück

Wählen Sie ID, LÄNGE, LOKALE PROVINZ, LOKALE STADT, EIGENTÜMERPROVINZ, EIGENTÜMERSTADT, ROAMING-TYP, SCHNITTSTELLE, XDR-ID, RAT, IMSI, IMEI, MSISDN, STARTZEIT DES VERFAHRENS, ENDE DES VERFAHRENS, TRANSAKTIONSTYP, TRANSAKTIONSSTATUS, QUELL-NE-IP, QUELL-NE-PORT, ZIEL-NE-IP, ZIEL-NE-PORT, ERGEBNISCODE, EXPERIMENTELLES ERGEBNISCODE, URSPRUNGSBEREICH, ZIEL-REALM, URSPRUNGS-HOST, ZIEL-HOST, DATUM EINFÜGEN aus xdr_authen_tmp;

ENDE;
TABELLE xdr_authen_tmp abschneiden;

ENDE
;;
TRENNUNGSZEICHEN ;

Die oben beschriebene Operation der MySql-Gruppierung und des zufälligen Abrufens eines Datenelements aus jeder Gruppe ist der gesamte Inhalt, den der Editor mit Ihnen teilt. Ich hoffe, er kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen.

Das könnte Sie auch interessieren:
  • Implementieren Sie Group By basierend auf MySQL, um die neuesten Daten jeder Gruppe zu erhalten
  • MySQL-Unterabfragen und gruppierte Abfragen
  • MySQL-Gruppierungsabfragen und Aggregatfunktionen
  • MySql Group By implementiert die Gruppierung mehrerer Felder
  • Detaillierte Erklärung der MySQL-Gruppensortierung, um die Top N zu finden
  • Detailliertes Beispiel zum Abrufen des Maximalwerts jeder Gruppe nach der Gruppierung in MySQL
  • Mysql verwendet eine gruppenweise Sortierung
  • Detaillierte Erklärung der MySQL-Datengruppierung

<<:  Detaillierter Installationsprozess und Prinzip des Vue-Routers

>>:  Tutorial zum schnellen Bereitstellen eines Nebula Graph-Clusters mit Docker Swarm

Artikel empfehlen

Tiefgreifendes Verständnis der Matching-Logik von Server und Standort in Nginx

Server-Abgleichlogik Wenn Nginx entscheidet, in w...

React Native JSI implementiert Beispielcode für RN und native Kommunikation

Inhaltsverzeichnis Was ist JSI Was ist anders an ...

vue2.x-Konfiguration von vue.config.js zur Projektoptimierung

Inhaltsverzeichnis Vorwort vue.config.js-Konfigur...

Detaillierte Erklärung der neuen Erfahrung von Vite

Was ist Vite? (Es ist ein neues Spielzeug im Fron...

MySQL-Reihe: Grundlegende Konzepte der relationalen MySQL-Datenbank

Inhaltsverzeichnis 1. Grundlegende Konzepte 2. En...

Beispiel für das Schreiben von mobilem H5 zum Aufrufen einer APP (IOS, Android)

iOS 1. URL-Schema Diese Lösung ist grundsätzlich ...

Implementierung von Wasserfall-Layout + dynamischem Rendering

Inhaltsverzeichnis Typische Wasserfall-Website Wa...

So lösen Sie das Problem der hohen Parallelität in der MySQL-Datenbank

Vorwort Wir alle wissen, dass Startups zunächst m...

Modulare CSS-Lösung

Es gibt wahrscheinlich ebenso viele modulare Lösu...

Prinzipien und Beispiele für Lambda-Ausdrücke

Lambda-Ausdrücke Lambda-Ausdrücke, auch Closures ...