IN
не работает для разделенных запятыми списков значений.
По сути, вы не сравниваете целые числа, вы сравниваете строки:
SELECT 1 IN (1, 2, 3) -- True
SELECT 1 IN ('1, 2, 3') -- False ('1' <> '1, 2, 3')
Вместо этого используйте FIND_IN_SET
:
SELECT products.title,products.image_ids, GROUP_CONCAT(images.file_name)
FROM products
LEFT JOIN
images
ON FIND_IN_SET(images.id, products.image_ids)
WHERE products.id = 1
GROUP BY
products.id
Это, однако, не лучшее решение с точки зрения производительности, поскольку FIND_IN_SET
не может быть sargable.Это потребует полного сканирования таблицы на images
.
Если у вас есть разумное ограничение на количество значений в products.image_ids
(скажем, не более 5
изображений на продукт), вы можете использоватьэтот запрос вместо:
SELECT products.title,products.image_ids, GROUP_CONCAT(images.file_name)
FROM (
SELECT 1 AS n
UNION ALL
SELECT 2 AS n
UNION ALL
SELECT 3 AS n
UNION ALL
SELECT 4 AS n
UNION ALL
SELECT 5 AS n
) q
CROSS JOIN
products
LEFT JOIN
images
ON SUBSTRING_INDEX(SUBSTRING_INDEX(image_ids, ',', n), ',', 1)
WHERE products.id = 1
AND SUBSTRING_INDEX(image_ids, ',', n) <> SUBSTRING_INDEX(image_ids, ',', n - 1)
GROUP BY
products.id