Heim > Datenbank > MySQL-Tutorial > FIND_IN_SET() vs. IN(): Wann sollte ich die einzelnen Funktionen für Abfragen mit mehreren Tabellen verwenden?

FIND_IN_SET() vs. IN(): Wann sollte ich die einzelnen Funktionen für Abfragen mit mehreren Tabellen verwenden?

Patricia Arquette
Freigeben: 2024-12-11 08:02:13
Original
408 Leute haben es durchsucht

FIND_IN_SET() vs. IN(): When Should I Use Each Function for Multi-Table Queries?

FIND_IN_SET() vs. IN(): Abfrageunterschiede verstehen

Beim Abfragen von Daten aus mehreren Tabellen ist es wichtig, die Syntax zu verstehen Die Verwendung beeinflusst die Ergebnisse. Stellen Sie sich die folgende Situation vor:

Sie haben zwei Tische, einen für Bestellungen und einen für Unternehmen. Die Auftragstabelle enthält eine Spalte „attachedCompanyIDs“ mit durch Kommas getrennten Firmen-IDs, und die Firmentabelle enthält die Spalten „CompanyID“ und „Name“.

Abfrage mit FIND_IN_SET()

Die folgende Abfrage ermöglicht es Ihnen, alle Firmennamen abzurufen, die mit einer bestimmten Bestellung verknüpft sind:

SELECT name FROM orders, company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
Nach dem Login kopieren

Diese Abfrage gibt erfolgreich alle Firmennamen zurück: Firma 1, Another Company und StackOverflow.

Abfrage mit IN()

Wenn Sie die Abfrage jedoch leicht ändern, indem Sie FIND_IN_SET() durch IN() ersetzen, wird die Ergebnisänderung:

SELECT name FROM orders, company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
Nach dem Login kopieren

In diesem Fall gibt die Abfrage nur den ersten Firmennamen zurück, der in der Spalte „attachedCompanyIDs“ aufgeführt ist: Unternehmen 1.

Den Unterschied verstehen

Der Grund für diese Ungleichheit liegt in der Art und Weise, wie diese beiden Funktionen die Spalte „attachedCompanyIDs“ behandeln.

  • FIND_IN_SET(): Diese Funktion berücksichtigt die gesamte Zeichenfolge angehängterCompanyIDs und prüft auf Vorhandensein der Firmen-ID darin.
  • IN(): Diese Funktion interpretiert angehängte Firmen-IDs als Skalarwert (z. B. eine einzelne Zahl) und prüft, ob sie mit der angegebenen Firmen-ID übereinstimmt.

Potenzielles Problem mit IN()

In Ihrem Datenbankbeispiel: „attachedCompanyIDs“ wird als Zeichenfolge gespeichert. Bei Verwendung in der Funktion IN() wird es automatisch in eine Ganzzahl umgewandelt. Bei diesem Casting wird jedoch nur die erste Ziffer vor dem Komma berücksichtigt. Daher wird nur die erste Firmen-ID in der angehängtenCompanyIDs-Liste berücksichtigt.

Mögliche Lösungen

  • Verwenden Sie einen direkten Tabellen-Join: Join die Tabellen „Bestellungen“ und „Firma“ in der Spalte „companyID“, um die Firmennamen abzurufen. Dieser Ansatz gewährleistet genaue Ergebnisse, kann sich jedoch auf die Leistung auswirken, wenn jeder Bestellung zahlreiche Unternehmens-IDs zugeordnet sind.
  • Verwenden Sie eine erweiterte Abfrage:Wenn Sie nur eine begrenzte Anzahl von Werten haben In der Spalte „attachedCompanyIDs“ können Sie eine komplexere Abfrage wie diese verwenden:

    SELECT name
    FROM orders
    CROSS JOIN (
      SELECT 1 AS pos
      UNION ALL
      SELECT 2 AS pos
      UNION ALL
      SELECT 3 AS pos
      UNION ALL
      SELECT 4 AS pos
      UNION ALL
      SELECT 5 AS pos
    ) q
    JOIN company
    ON companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)
    Nach dem Login kopieren

Diese Abfrage extrahiert einzelne Firmen-IDs aus der Zeichenfolge „attachedCompanyIDs“ mit der Funktion SUBSTRING_INDEX().

Das obige ist der detaillierte Inhalt vonFIND_IN_SET() vs. IN(): Wann sollte ich die einzelnen Funktionen für Abfragen mit mehreren Tabellen verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage