Thursday, September 26, 2019

Mysql : FIND_IN_SET() vs IN()

Orders has this structure:
OrderID     |     attachedCompanyIDs
------------------------------------
   1                     1,2,3
   2                     2,4
And Company has this structure:
CompanyID      |        name
--------------------------------------
    1                 Company 1
    2                 Another Company
    3                 StackOverflow
    4                 Nothing
To get an order's companies names, 
I can do a query as such: SELECT name FROM orders,company WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs) 
That query works fine, but the following query does not.
 SELECT name FROM orders,company WHERE orderID = 1 AND companyID IN (attachedCompanyIDs) 
Why does the first query work but not the second one?
Explanation :
SELECT  name
FROM    orders,company
WHERE   orderID = 1
        AND companyID IN (attachedCompanyIDs)
attachedCompanyIDs is a scalar value which is cast into INT (type of companyID).
The cast only returns numbers up to the first non-digit (a comma in your case).
Thus,
companyID IN ('1,2,3')  companyID IN (CAST('1,2,3' AS INT))  companyID IN (1)


No comments:

Post a Comment