wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.

Как правильно использовать JOIN с конструкцией IN()?

Есть подобный запрос:
SELECT * 
FROM products_fieldlist AS fl
LEFT JOIN products_fieldcats AS fc ON fl.id
IN (
fc.fields
)


Таблица products_fieldcats:
id | category_id | fields
1 | 118 | 1,2,3

Таблица products_fieldlist:
id | index | name | values | unical
1 | shoes_color | ფერი | values | 0
2 | shoes_size | ზომა | values | 1
3 | shoes_brand | ბრენდი | values | 1

При выполнении выводится такой ответ:
30099e6ff43d4136bc9e42da81a28d45.png

Вопрос: как правильно составить запрос, чтобы вместо NULL была верная информация из таблицы products_fieldcats?
  • Вопрос задан
  • 242 просмотра
Решения вопроса 2
@Fantyk
web developer
ОООчень плохое решение вашего вопроса: sqlfiddle.com/#!9/2201c/7/0
Если вы еще создаете схему я рекомендую сделать колонку fields уникальной и заполняемой только цифрами, тогда запросы будет составлять намного проще и они будут выполняться быстрее.

По поводу WHERE: это условие делает фильтр по уже сджойненной таблице, поэтому все усвловия джойна таблиц нужно писать внутри ON
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Тип поля `fields`, я так понимаю, VARCHAR.
Так работать не будет. IN() ищет элемент в списке элементов, а на вход поступает один элемент - строка '1,2,3'.
Нормализуйте базу, переделайте products_fieldcats, уберите поле `id`, оставьте поле `category_id` и замените `fields` на `field` INT. Первичным ключом будет пара (`category_id`, `field`). Тогда запрос преобразуется в
SELECT *
    FROM `products_fieldlist` AS fl
    LEFT JOIN `products_fieldcats` AS `fc` ON `fl`.`id` = `fc`.`field`
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
w999d
@w999d
Web-developer
исправьте вопрос на "Как правильно использовать JOIN с конструкцией ON()?"
впрочем обе неверно составлены
Ответ написан
SowingSadness
@SowingSadness
web-разработчик
1. Берёте вместо ущербного MySQL PostgreSQL
2. Организовываете хранение fields вместо varchar в int[]
3. Ваш запрос сразу начнёт работать правильнее и быстрее чем вариант Fantyk
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы