首頁 >資料庫 >mysql教程 >如何在逗號分隔的 MySQL 欄位中有效率地搜尋多個字串?

如何在逗號分隔的 MySQL 欄位中有效率地搜尋多個字串?

Barbara Streisand
Barbara Streisand原創
2025-01-11 19:31:43827瀏覽

How Can I Efficiently Search for Multiple Strings in a Comma-Separated MySQL Field?

MySQL:一種更有效的多字串 find_in_set 方法

MySQL 的 find_in_set 函數僅限於逗號分隔值內的單一字串搜尋。 當需要同時查找與多個搜尋字串相符的記錄時,這提出了挑戰。

挑戰:

目標是識別包含逗號分隔值的欄位包含所有指定搜尋字串的記錄。 例如,在「a,b,c,d」中搜尋「a,b,c」應該會產生匹配。

卓越的解決方案:

不是使用 find_in_set 運算子連結多個 OR 呼叫(這可能效率低下),更有效的方法是在更結構化的 FIND_IN_SET 子句中利用 WHERE 函數:

<code class="language-sql">WHERE FIND_IN_SET('val1', setcolumn) > 0
  AND FIND_IN_SET('val2', setcolumn) > 0
  AND FIND_IN_SET('val3', setcolumn) > 0</code>

地點:

  • setcolumn 表示以逗號分隔值的欄位。
  • val1val2val3 等是搜尋字串。

說明:

此方法使用 AND 來確保 所有 搜尋字串都存在於 setcolumn 中。 如果找到字串,每個 FIND_IN_SET 呼叫都會傳回一個位置(大於 0 的值);否則,傳回 0。 AND 條件保證只會傳回包含所有指定字串的記錄。

範例:

<code class="language-sql">SELECT * FROM table
WHERE FIND_IN_SET('a', setcolumn) > 0
  AND FIND_IN_SET('b', setcolumn) > 0
  AND FIND_IN_SET('c', setcolumn) > 0;</code>

此查詢將只傳回 setcolumn 包含「a」、「b」和「c」的記錄。

重要注意事項:

雖然此方法通常比 REGEXP 方法更有效,但請記住,在資料庫欄位中儲存逗號分隔值通常被認為是糟糕的資料庫設計。規範化資料庫(建立單獨的表來表示關係)對於效能和資料完整性來說是一個更好的長期解決方案。 這種方法主要是針對現有的非標準化資料的解決方法。

以上是如何在逗號分隔的 MySQL 欄位中有效率地搜尋多個字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn