SELECT name
FROM orders,company
WHERE orderID = 1
AND companyID IN (attachedCompanyIDs)
attachedCompanyIDs
je skalární hodnota, která je přetypována do INT
(typ companyID
).
Přetypování vrací pouze čísla do první nečíslice (ve vašem případě čárka).
Tedy,
companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)
V PostgreSQL
, můžete přenést řetězec do pole (nebo jej uložit jako pole na prvním místě):
SELECT name
FROM orders
JOIN company
ON companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
WHERE orderID = 1
a to by dokonce použilo index na companyID
.
Bohužel to nefunguje v MySQL
protože druhý nepodporuje pole.
Možná vás tento článek zaujme (viz #2
):
Aktualizace:
Pokud existuje nějaký rozumný limit na počet hodnot v seznamech oddělených čárkami (řekněme ne více než 5
), takže můžete zkusit použít tento dotaz:
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)