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
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;
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:
|
<<: Detaillierter Installationsprozess und Prinzip des Vue-Routers
>>: Tutorial zum schnellen Bereitstellen eines Nebula Graph-Clusters mit Docker Swarm
Server-Abgleichlogik Wenn Nginx entscheidet, in w...
Inhaltsverzeichnis Was ist JSI Was ist anders an ...
Die Ausführungsbeziehung zwischen dem href-Sprung...
Inhaltsverzeichnis 1. Betrieb der Datenbank 1.1 E...
Inhaltsverzeichnis Vorwort vue.config.js-Konfigur...
Ich habe mich beim Backend angemeldet, um die Lös...
Was ist Vite? (Es ist ein neues Spielzeug im Fron...
Inhaltsverzeichnis 1. Grundlegende Konzepte 2. En...
iOS 1. URL-Schema Diese Lösung ist grundsätzlich ...
Vorwort Kürzlich stieß ich in einem Projekt auf e...
Inhaltsverzeichnis Typische Wasserfall-Website Wa...
1. Installieren Sie das Baidu Eslint Rule-Plugin ...
Vorwort Wir alle wissen, dass Startups zunächst m...
Es gibt wahrscheinlich ebenso viele modulare Lösu...
Lambda-Ausdrücke Lambda-Ausdrücke, auch Closures ...