SELECT name
FROM orders,company
WHERE orderID = 1
AND companyID IN (attachedCompanyIDs)
attachedCompanyIDs
е скаларна стойност, която се прехвърля в INT
(тип companyID
).
Прехвърлянето връща само числа до първата нецифрена (запетая във вашия случай).
По този начин,
companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)
В PostgreSQL
, можете да прехвърлите низа в масив (или да го съхраните като масив на първо място):
SELECT name
FROM orders
JOIN company
ON companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
WHERE orderID = 1
и това дори би използвало индекс на companyID
.
За съжаление, това не работи в MySQL
тъй като последният не поддържа масиви.
Може да ви е интересна тази статия (вижте #2
):
Актуализация:
Ако има някакво разумно ограничение за броя на стойностите в списъците, разделени със запетая (да речем, не повече от 5
), така че можете да опитате да използвате тази заявка:
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)