首頁 >資料庫 >mysql教程 >MySQL FIND_IN_SET() 與 IN():為什麼 IN() 只傳回第一個以逗號分隔的 ID 匹配項?

MySQL FIND_IN_SET() 與 IN():為什麼 IN() 只傳回第一個以逗號分隔的 ID 匹配項?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-11 10:40:12606瀏覽

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

FIND_IN_SET() 與IN():了解MySQL 中的差異

問題:

在MySQL 中,我們有兩個表:「orders」和「company」。 「orders」中的「attachedCompanyIDs」欄位儲存引用「company」中行的逗號分隔的 ID 清單。當使用 FIND_IN_SET() 查詢與訂單關聯的公司名稱時,我們得到了預期的結果。但是,使用 IN() 僅返回第一個匹配的公司。為什麼會發生這種情況?

答案:

attachedCompanyIDs 欄位是 VARCHAR 類型的標量值。當使用 IN() 時,MySQL 將字串轉換為整數,並在第一個非數字字元(即逗號)處截斷它。這意味著如果attachedCompanyIDs包含多個值,則只會考慮第一個進行IN比較。

解決方法:

根據您的特定場景,有此問題的幾種解決方法:

  1. 使用ARRAY類型(PostgreSQL僅): PostgreSQL支援數組資料類型,允許您將逗號分隔的清單儲存為數組。這使您能夠使用 ANY() 正確比較 AttachedCompanyIDs 中的值與 companyID 欄位。
  2. 有限值清單: 如果 AttachedCompanyIDs 中逗號分隔清單的長度有限,您可以使用一系列 UNION ALL 查詢將字串轉換為多行。這允許您分別對每一行執行 IN 比較。

其他注意事項:

  1. 效能影響:使用FIND_IN_SET() 可能會導致效能問題,尤其是對於效能問題,尤其是對於效能大型數據集。使用上述替代解決方案可以提高這些場景中的效能。
  2. 可讀性和維護:替代解決方案可能比使用 FIND_IN_SET() 更複雜且可讀性更差。做出選擇時請仔細考慮效能和可維護性之間的權衡。

以上是MySQL FIND_IN_SET() 與 IN():為什麼 IN() 只傳回第一個以逗號分隔的 ID 匹配項?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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