Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Здравствуйте, уважаемые форумчане! Подскажите, плиз, у меня есть поле, в котором хранятся ID - записей в виде строки вот так 1,2,3,4. Я хочу по этому полю подгрузить соответствующие записи. В SQL- запросе указываю на сравнение оператора IN поле, где храняться записи, но ничего не происходит. Вот запрос:
SELECT t2.name AS `brand_id_caption`, t3.code AS `shiny_id_caption`, t.* FROM `autho_test` AS `t`
LEFT JOIN `autho_sniyproizvoditel` AS `t2` ON (t2.id = t.brand_id)
LEFT JOIN `autho_shiny` AS `t3` ON t3.id IN (t.shiny_id)
Интересно отметить, что, если, заменить в запросе подставляемое поле t.shiny_id на реальные значения 1,2,3,4, тогда запрос выполниться корректно, т.е.:
SELECT t2.name AS `brand_id_caption`, t3.code AS `shiny_id_caption`, t.* FROM `autho_test` AS `t`
LEFT JOIN `autho_sniyproizvoditel` AS `t2` ON (t2.id = t.brand_id)
LEFT JOIN `autho_shiny` AS `t3` ON t3.id IN (1,2,3,4)
Делаю вывод, что вероятно в запросе для поля t.shiny_id нужно как-то указывать, что это список данных. Что делать подскажите?
Неактивен
Правильный ответ — не хранить данные в списке через запятую. Никогда.
Храните их в столбик в разных строках и используйте присоединения (JOIN).
Для текущего формата — можно попробовать подготовить выражение (PREPARE),
а потом выполнить его. Но это костыль. Лучше так не делать.
Неактивен
Как уже писал paulus, это действительно абсолютно не правильная архитектура. Тут по любому оптимально не как не сделаешь.
PREPARE - не прокатит, так как t.shiny_id это значение из другой таблицы ... Может разве что если вообще всё переписать.
SaintRain почему у вас не работает ?
Потому что вместо IN(1,2,3,4) у вас получается IN('1,2,3,4')
Есть костыльное решение :
SELECT t2.name AS `brand_id_caption`, t3.code AS `shiny_id_caption`, t.* FROM `autho_test` AS `t`
LEFT JOIN `autho_sniyproizvoditel` AS `t2` ON (t2.id = t.brand_id)
LEFT JOIN `autho_shiny` AS `t3` ON CONCAT(',',t3.id,',') LIKE CONCAT('%,',t.shiny_id,',%');
Но лучше создать нормальную таблицу связей.
Вот похожий топик http://sqlinfo.ru/forum/viewtopic.php?id=4310
Неактивен
Ну, почему не прокатит:
SELECT @blah = shiny_id FROM othertable;
PREPARE stmt FROM CONCAT('SELECT something FROM thistable WHERE id IN(', @blah, ')');
Неактивен
Страниц: 1