Heim >Datenbank >MySQL-Tutorial >MySQL FIND_IN_SET() vs. IN(): Warum gibt IN() nur die erste Übereinstimmung mit durch Kommas getrennten IDs zurück?

MySQL FIND_IN_SET() vs. IN(): Warum gibt IN() nur die erste Übereinstimmung mit durch Kommas getrennten IDs zurück?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-11 10:40:12606Durchsuche

MySQL FIND_IN_SET() vs IN(): Why Does IN() Only Return the First Match with Comma-Separated IDs?

FIND_IN_SET() vs. IN(): Den Unterschied in MySQL verstehen

Frage:

In MySQL haben wir zwei Tabellen: „orders“ und „company“. In der Spalte „attachedCompanyIDs“ in „orders“ wird eine durch Kommas getrennte Liste von IDs gespeichert, die auf Zeilen in „company“ verweisen. Bei der Abfrage von Firmennamen, die mit einer Bestellung verknüpft sind, mit FIND_IN_SET() erhalten wir die erwarteten Ergebnisse. Wenn Sie jedoch stattdessen IN() verwenden, wird nur das erste passende Unternehmen zurückgegeben. Warum passiert das?

Antwort:

Die Spalte „attachedCompanyIDs“ ist ein Skalarwert vom Typ VARCHAR. Bei Verwendung von IN() wandelt MySQL die Zeichenfolge in eine Ganzzahl um und schneidet sie beim ersten nicht numerischen Zeichen (d. h. einem Komma) ab. Das bedeutet, dass, wenn attachmentCompanyIDs mehrere Werte enthält, nur der erste für den IN-Vergleich berücksichtigt wird.

解决方法:

Abhängig von Ihrem spezifischen Szenario gibt es welche Mehrere Problemumgehungen für dieses Problem:

  1. Verwenden Sie ARRAY-Typen (Nur PostgreSQL): PostgreSQL unterstützt Array-Datentypen, sodass Sie durch Kommas getrennte Listen als Arrays speichern können. Dadurch können Sie ANY() verwenden, um die Werte in attachmentCompanyIDs korrekt mit der Spalte „companyID“ zu vergleichen.
  2. Listen mit begrenzten Werten: Wenn die Länge der durch Kommas getrennten Listen in attachmentCompanyIDs begrenzt ist, Sie können eine Reihe von UNION ALL-Abfragen verwenden, um die Zeichenfolge in mehrere Zeilen umzuwandeln. Dadurch können Sie den IN-Vergleich für jede Zeile separat durchführen.

Zusätzliche Überlegungen:

  1. Auswirkungen auf die Leistung: Die Die Verwendung von FIND_IN_SET() kann möglicherweise zu Leistungsproblemen führen, insbesondere bei großen Datensätzen. Die Verwendung der oben genannten alternativen Lösungen kann die Leistung in diesen Szenarien verbessern.
  2. Lesbarkeit und Wartung: Die alternativen Lösungen können komplexer und weniger lesbar sein als die Verwendung von FIND_IN_SET(). Berücksichtigen Sie bei Ihrer Wahl sorgfältig die Kompromisse zwischen Leistung und Wartbarkeit.

Das obige ist der detaillierte Inhalt vonMySQL FIND_IN_SET() vs. IN(): Warum gibt IN() nur die erste Übereinstimmung mit durch Kommas getrennten IDs zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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