SELECT name
FROM orders,company
WHERE orderID = 1
AND companyID IN (attachedCompanyIDs)
attachedCompanyIDs
là một giá trị vô hướng được truyền vào INT
(loại companyID
).
Phép ép kiểu chỉ trả về các số có tối đa không phải chữ số đầu tiên (trong trường hợp của bạn là dấu phẩy).
Vì vậy,
companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)
Trong PostgreSQL
, bạn có thể ép chuỗi thành mảng (hoặc lưu trữ nó dưới dạng một mảng ngay từ đầu):
SELECT name
FROM orders
JOIN company
ON companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
WHERE orderID = 1
và điều này thậm chí sẽ sử dụng một chỉ mục trên companyID
.
Rất tiếc, điều này không hoạt động trong MySQL
vì sau này không hỗ trợ mảng.
Bạn có thể thấy bài viết này thú vị (xem #2
):
Cập nhật:
Nếu có một số giới hạn hợp lý về số lượng giá trị trong danh sách được phân tách bằng dấu phẩy (giả sử, không quá 5
), vì vậy bạn có thể thử sử dụng truy vấn này:
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)