Detaillierte Erklärung zur Verwendung der Funktion find_in_set() in MySQL

Detaillierte Erklärung zur Verwendung der Funktion find_in_set() in MySQL

Betrachten wir zunächst ein Beispiel:

In der Artikeltabelle gibt es ein Typfeld, in dem der Artikeltyp gespeichert wird, darunter 1 Überschrift, 2 Empfehlung, 3 Hotspot, 4 Bild und Text usw.

Jetzt gibt es einen Artikel, der sowohl eine Überschrift, ein aktuelles Thema als auch ein Bild und Text enthält und im Format 1,3,4 in der Schrift gespeichert ist. Wie verwenden wir also SQL, um alle Artikel vom Typ 4 zu finden, die Bilder und Texte enthalten? ?

Hier kommt find_in_set ins Spiel. Nachfolgend der zitierte Inhalt:

Wählen Sie * aus dem Artikel, wobei FIND_IN_SET('4',Typ)

----------------------------------------------------------

Syntax der find_in_set-Funktion aus dem MySQL-Handbuch:

FIND_IN_SET(str,strlist)

str Die zu durchsuchende Zeichenfolge

Die Parameter für die Feldnamen in strlist werden durch "," getrennt, z. B. (1,2,6,8).

Abfrage der Ergebnisse, die (str) im Feld (strlist) enthalten, und Rückgabe des Ergebnisses als Null oder Datensatz

Wenn sich der String str in der Stringliste strlist befindet, die aus N Teilstrings besteht, liegt der Rückgabewert zwischen 1 und N. Eine Zeichenfolgenliste ist eine Zeichenfolge, die aus durch die Zeichen „,“ getrennten Teilzeichenfolgen besteht. Wenn das erste Argument eine konstante Zeichenfolge und das zweite eine Spalte vom Typ SET ist, ist die Funktion FIND_IN_SET() für die Verwendung der bitweisen Arithmetik optimiert. Wenn str nicht in strlist enthalten ist oder strlist eine leere Zeichenfolge ist, ist der Rückgabewert 0. Wenn ein beliebiger Parameter NULL ist, ist der Rückgabewert NULL. Diese Funktion funktioniert nicht richtig, wenn das erste Argument ein Komma (',') enthält.

--------------------------------------------------------

Beispiel:

mysql> SELECT FIND_IN_SET('b', 'a,b,c,d'); 
-> 2 Da b an Position 2 im Strlist-Set platziert ist, beginnend bei 1, select FIND_IN_SET('1', '1'); Der Rückgabewert ist 1. Das Strlist-Set ist zu diesem Zeitpunkt etwas speziell. Es gibt nur eine Zeichenfolge. Tatsächlich ist es erforderlich, dass die vorherige Zeichenfolge im nächsten Zeichenfolgenset enthalten sein muss, um eine Zahl größer als 0 zurückzugeben. select FIND_IN_SET('2', '1,2'); Gibt 2 zurück 
wähle FIND_IN_SET('6', '1'); gibt 0 zurück

--------------------------------------------------------

Beachten:

Wählen Sie * aus Treenodes, wobei FIND_IN_SET (ID, „1,2,3,4,5“);

Verwenden Sie die Funktion find_in_set, um mehrere Datensätze gleichzeitig zurückzugeben. id ist ein Feld einer Tabelle, und jeder Datensatz hat eine ID gleich 1, 2, 3, 4, 5. Es ist ein bisschen wie in (set)

Wählen Sie * aus Treenodes mit der ID in (1,2,3,4,5);

--------------------------------------------------------

Der Unterschied zwischen find_in_set() und in:

Erstellen Sie eine Testtabelle, um den Unterschied zwischen den beiden zu veranschaulichen

Tabelle „tb_test“ erstellen (
 `id` int(8) NICHT NULL auto_increment,
 `name` varchar(255) NICHT NULL,
 `Liste` varchar(255) NICHT NULL,
 PRIMÄRSCHLÜSSEL (`id`)
);
INSERT INTO `tb_test` VALUES (1, 'Name', 'daodao, xiaohu, xiaoqin');
INSERT INTO `tb_test` VALUES (2, 'name2', 'xiaohu, daodao, xiaoqin');
INSERT INTO `tb_test` VALUES (3, 'name3', 'xiaoqin, daodao, xiaohu');

Ich dachte ursprünglich, dass MySQL eine solche Abfrage durchführen könnte:

SELECT id,name,liste aus tb_test WHERE 'daodao' IN(liste); -- (I) 

Tatsächlich funktioniert das nicht. Die Abfrage ist nur gültig, wenn der Wert des Listenfelds gleich 'daodao' ist (also vollständig mit der Zeichenfolge vor IN übereinstimmt). Andernfalls werden keine Ergebnisse erhalten, selbst wenn 'daodao' tatsächlich in der Liste steht.

Schauen wir uns das an:

Wählen Sie ID, Name, Liste aus tb_test aus, wobei 'daodao' in ('libk', 'zyfon', 'daodao') angegeben ist. -- (II) 

Das ist in Ordnung.

Was ist der Unterschied zwischen diesen beiden? Warum der erste nicht das richtige Ergebnis erzielen kann, der zweite jedoch schon. Der Grund dafür ist, dass (Liste) Liste in (1) eine Variable ist, während ('libk', 'zyfon', 'daodao') in (2) Konstanten sind.

Wenn Sie also möchten, dass (1) korrekt funktioniert, müssen Sie find_in_set() verwenden:

SELECT id,name,list from tb_test WHERE FIND_IN_SET('daodao',list); – Verbesserte Version von (I) 

Zusammenfassen:

Wenn die Liste also eine Konstante ist, können Sie IN direkt verwenden, andernfalls müssen Sie die Funktion find_in_set() verwenden.

--------------------------------------------------------

Der Unterschied zwischen find_in_set() und like:

Manchmal müssen wir bei Datenbankabfragen in MySQL Datensätze abrufen, die einen bestimmten Wert in einem bestimmten Feld enthalten, aber das lässt sich nicht mit LIKE lösen. Mit LIKE finden wir möglicherweise Datensätze, die wir nicht haben möchten. Es ist genauer als LIKE. In diesem Fall ist die FIND_IN_SET-Funktion von MySQL praktisch. Sehen wir uns ein Beispiel an.

Tabelle erstellen und Anweisung einfügen:

CREATE TABLE-Benutzer (
  id int(6) NICHT NULL AUTO_INCREMENT,
  Name VARCHAR(20) NOT NULL,
  Grenzen VARCHAR (50) NOT NULL, -- Privileg PRIMARY KEY (id)
);
INSERT INTO Benutzer (Name, Grenzen) VALUES ('Xiao Zhang', '1,2,12'); 
INSERT INTO Benutzer (Name, Grenzen) VALUES ('Xiao Wang', '11,22,32');

Unter ihnen gibt limits die Berechtigungen an, die der Benutzer hat (durch Kommas getrennt). Nun möchten wir den Benutzer mit der Berechtigungsnummer 2 abfragen. Wenn wir das Schlüsselwort like verwenden, lauten die Abfrageergebnisse wie folgt:

SELECT * FROM Benutzer WHERE Grenzen LIKE '%2%'; 

Auf diese Weise werden die zweiten Daten auch für Benutzer gefunden, die nicht über die Berechtigung „2“ verfügen, was nicht den Erwartungen entspricht. Im Folgenden wird zur Lösung des Problems die MySQL-Funktion find_in_set() verwendet.

SELECT * FROM Benutzer WHERE FIND_IN_SET(2,Grenzen); 

So erzielen wir den gewünschten Effekt und das Problem ist gelöst!

Hinweis: Die MySQL-String-Funktion find_in_set(str1,str2) gibt den Index der Position von str1 in str2 zurück. str2 muss durch "," getrennt werden.

Zusammenfassung: LIKE ist ein breiter Fuzzy-Match, im String ist kein Trennzeichen vorhanden, Find_IN_SET ist ein exakter Match, die Feldwerte sind durch englische "," getrennt und das Ergebnis der Find_IN_SET-Abfrage ist kleiner als das Ergebnis der LIKE-Abfrage.

Zusammenfassen

Oben finden Sie eine ausführliche Erklärung der Verwendung der Funktion find_in_set() in MySQL, die vom Herausgeber eingeführt wurde. Ich hoffe, dass sie für alle hilfreich sein wird. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung zur Verwendung der Funktionen find_in_set() und in() in MySQL
  • So verwenden Sie die MySQL FIND_IN_SET-Funktion
  • Detaillierte Erläuterung der Verwendung der integrierten Funktion „locate instr position find_in_set“ in der effizienten Fuzzy-Suche von MySQL
  • MySQL verwendet die Funktion find_in_set(), um die Sortierung in der Reihenfolge where in() zu implementieren.
  • Grundlegende Verwendung der Funktion find_in_set in MySQL

<<:  Beispielcode für Django+Vue-Registrierung und -Anmeldung

>>:  Detaillierte Erklärung zur Installation der PHP-Curl-Erweiterung unter Linux

Artikel empfehlen

JavaScript Canvas-Textuhr

In diesem Artikelbeispiel wird der spezifische Co...

Snake-Spiel mit nativem JS schreiben

In diesem Artikel wird der spezifische Code zum S...

Mysql Workbench - Abfragemethode für MySQL-Datenbanken

Mysql Workbench ist ein Open-Source-Datenbankclie...

VUE+Canvas realisiert den gesamten Prozess eines einfachen Gobang-Spiels

Vorwort In Bezug auf das Layout ist Gobang viel e...

MySQL 8.0.17 Installations- und einfaches Konfigurationstutorial unter macOS

Wenn Sie nicht verstehen, was ich geschrieben hab...

SpringBoot integriert Activiti7-Implementierungscode

Nach der offiziellen Veröffentlichung von Activit...

Anwendung von Ankerpunkten in HTML

Ankerpunkt festlegen <a name="nach oben&qu...

Node+Express zum Erzielen eines Paging-Effekts

In diesem Artikel wird der spezifische Code von n...

So aktualisieren Sie die Ansicht synchron nach Datenänderungen in Vue

Vorwort Vor kurzem bin ich auf ein interessantes ...

Beispiel für ein JavaScript-Meldungsfeld

In JavaScript können drei Arten von Meldungsfelde...

So verweisen Sie auf jQuery in einer Webseite

Die Referenzierung ist über CDN (Content Delivery ...

Vue implementiert die Abfrage von Startzeit und Endzeitbereich

In diesem Artikel erfahren Sie, wie Sie den Start...