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)
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)
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.
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 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)
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!