首頁 > 資料庫 > mysql教程 > FIND_IN_SET() 與 IN():何時應該使用每個函數進行多表查詢?

FIND_IN_SET() 與 IN():何時應該使用每個函數進行多表查詢?

Patricia Arquette
發布: 2024-12-11 08:02:13
原創
433 人瀏覽過

FIND_IN_SET() vs. IN(): When Should I Use Each Function for Multi-Table Queries?

FIND_IN_SET() 與IN():了解查詢差異

從多個表查詢資料時,了解語法如何使用至關重要使用影響結果。考慮以下情況:

您有兩張表,一張用於訂單,一張用於公司。 Orders 資料表包含一個 AttachedCompanyIDs 資料列,其中包含以逗號分隔的公司 ID,company 資料表包含 CompanyID 和 name 欄位。

使用FIND_IN_SET() 進行查詢

下面的查詢可讓您擷取與特定訂單相關的所有公司名稱:

SELECT name FROM orders, company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
登入後複製

此查詢成功傳回所有公司名稱:Company 1、Another Company 和StackOverflow。

使用IN() 查詢

但是,如果您稍微修改查詢,將FIND_IN_SET() 替換為IN(),結果改變:

SELECT name FROM orders, company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
登入後複製

在這種情況下,查詢只會傳回列在其中的第一個公司名稱AttachedCompanyIDs 欄位:公司1。

了解差異

造成這種差異的原因在於這兩個函數處理 AttachedCompanyIDs 欄位的方式。

  • FIND_IN_SET():函數考慮AttachedCompanyIDs 的整個字串並檢查其中是否存在companyID。
  • IN():此函數將attachedCompanyIDs 解釋為標量值(例如,單一數字)並檢查它是否與提供的公司 ID 相符。

潛在問題IN()

在您的資料庫範例中,attachedCompanyIDs 儲存為字串。當在 IN() 函數中使用時,它會自動轉換為整數。但是,此轉換僅考慮逗號之前的第一個數字。因此,僅考慮 AttachedCompanyIDs 清單中的第一個公司 ID。

可能的解決方案

  • 使用直接表連接: 連接訂單和公司表的companyID 列上檢索公司名稱。此方法可確保準確的結果,但如果每個訂單關聯有大量公司 ID,則可能會影響效能。
  • 使用更高級的查詢:如果您的值數量有限AttachedCompanyIDs 列,您可以使用更複雜的查詢,如下所示:

    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)
    登入後複製

此查詢使用SUBSTRING_INDEX() 函數從AttachedCompanyIDs字串中提取各個公司 ID。

以上是FIND_IN_SET() 與 IN():何時應該使用每個函數進行多表查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板