SELECT name
FROM orders,company
WHERE orderID = 1
AND companyID IN (attachedCompanyIDs)
attachedCompanyIDs
is een scalaire waarde die wordt gegoten in INT
(type companyID
).
De cast geeft alleen getallen terug tot aan het eerste niet-cijfer (een komma in jouw geval).
Dus,
companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)
In PostgreSQL
, je zou de string in een array kunnen casten (of deze in de eerste plaats als een array opslaan):
SELECT name
FROM orders
JOIN company
ON companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
WHERE orderID = 1
en dit zou zelfs een index gebruiken op companyID
.
Helaas werkt dit niet in MySQL
aangezien de laatste geen arrays ondersteunt.
Misschien vind je dit artikel interessant (zie #2
):
Bijwerken:
Als er een redelijke limiet is voor het aantal waarden in de door komma's gescheiden lijsten (bijvoorbeeld niet meer dan 5
), dus je kunt proberen deze zoekopdracht te gebruiken:
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)