SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.08.2011 13:45:25

SaintRain
Участник
Зарегистрирован: 11.08.2011
Сообщений: 1

Как выбрать записи из зависиомой таблицы по полю, содержащему список ID?

Здравствуйте, уважаемые форумчане! Подскажите, плиз, у меня есть поле, в котором хранятся 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 нужно как-то указывать, что это список данных. Что делать подскажите?

Неактивен

 

#2 25.08.2011 01:32:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Как выбрать записи из зависиомой таблицы по полю, содержащему список ID?

Правильный ответ — не хранить данные в списке через запятую. Никогда.
Храните их в столбик в разных строках и используйте присоединения (JOIN).

Для текущего формата — можно попробовать подготовить выражение (PREPARE),
а потом выполнить его. Но это костыль. Лучше так не делать.

Неактивен

 

#3 25.08.2011 10:18:16

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Как выбрать записи из зависиомой таблицы по полю, содержащему список ID?

Как уже писал 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

Неактивен

 

#4 25.08.2011 15:10:58

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Как выбрать записи из зависиомой таблицы по полю, содержащему список ID?

Ну, почему не прокатит:
SELECT @blah = shiny_id FROM othertable;
PREPARE stmt FROM CONCAT('SELECT something FROM thistable WHERE id IN(', @blah, ')');

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson