Heim >Datenbank >MySQL-Tutorial >FIND_IN_SET() vs. IN(): Wann sollte ich jedes für durch Kommas getrennte Werte verwenden?
FIND_IN_SET() vs. IN(): Das Abfrage-Rätsel enthüllen
Im Bereich der Datenbankabfrage ist es wichtig, die Nuancen zwischen verschiedenen Funktionen zu verstehen entscheidend. Eine solche Unterscheidung ergibt sich beim Vergleich von FIND_IN_SET() und IN(), insbesondere beim Abfragen von Werten, die als durch Kommas getrennte Zeichenfolgen gespeichert sind.
Die Abfragediskrepanz
Betrachten Sie zwei Tabellen: „orders“ mit einer Spalte „attachedCompanyIDs“, die durch Kommas getrennte Firmenkennungen enthält, und „company“ mit einer Spalte „companyID“ und entsprechende Firmennamen. Die folgende Abfrage ruft mit FIND_IN_SET() effektiv die mit einer Bestellung verknüpften Firmennamen ab:
SELECT name FROM orders, company WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
Eine ähnliche Abfrage mit IN() liefert jedoch unerwartete Ergebnisse:
SELECT name FROM orders, company WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
Die versteckte Falle
Die Hauptursache liegt darin, wie MySQL mit durch Kommas getrennten Werten umgeht, wenn angehängte Firmen-IDs umgewandelt werden in eine ganze Zahl umwandeln. Bei der Umwandlung werden Zahlen an der ersten Nicht-Ziffer abgeschnitten, wodurch die Zeichenfolge effektiv auf den ersten durch Kommas getrennten Wert reduziert wird.
Beispiel: Wenn „attachedCompanyIDs“ auf „1,2,3“ gesetzt ist, führt die IN()-Abfrage falsch aus wird zu:
companyID IN (1)
Dies erklärt, warum die IN()-Abfrage nur den ersten Firmennamen zurückgibt, während FIND_IN_SET() alle zurückgibt drei.
Überwindung der Einschränkung
Um dieses Problem zu beheben, sollten Sie alternative Ansätze in Betracht ziehen, die durch Kommas getrennte Zeichenfolgen angemessen verarbeiten. In PostgreSQL können Arrays verwendet werden:
SELECT name FROM orders JOIN company ON companyID = ANY(('{' || attachedCompanyIDs || '}')::INT[]) WHERE orderID = 1
Arrays werden in MySQL leider nicht unterstützt. Für eine begrenzte Anzahl von Werten (z. B. weniger als 5) ist eine Problemumgehung durch Cross-Join und String-Manipulation möglich:
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)
Das obige ist der detaillierte Inhalt vonFIND_IN_SET() vs. IN(): Wann sollte ich jedes für durch Kommas getrennte Werte verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!