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 欄位的方式。
潛在問題IN()
在您的資料庫範例中,attachedCompanyIDs 儲存為字串。當在 IN() 函數中使用時,它會自動轉換為整數。但是,此轉換僅考慮逗號之前的第一個數字。因此,僅考慮 AttachedCompanyIDs 清單中的第一個公司 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中文網其他相關文章!