SELECT name
FROM orders,company
WHERE orderID = 1
AND companyID IN (attachedCompanyIDs)
attachedCompanyIDs
jest wartością skalarną, która jest rzutowana na INT
(typ companyID
).
Obsada zwraca tylko liczby do pierwszej nie będącej cyfrą (w twoim przypadku przecinek).
Tak więc
companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)
W PostgreSQL
, możesz rzutować łańcuch na tablicę (lub najpierw zapisać go jako tablicę):
SELECT name
FROM orders
JOIN company
ON companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
WHERE orderID = 1
a to nawet użyłoby indeksu na companyID
.
Niestety to nie działa w MySQL
ponieważ ta ostatnia nie obsługuje tablic.
Ten artykuł może Cię zainteresować (patrz #2
):
Aktualizacja:
Jeśli istnieje jakiś rozsądny limit liczby wartości na listach oddzielonych przecinkami (powiedzmy, że nie więcej niż 5
), więc możesz spróbować użyć tego zapytania:
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)