Общее рассмотрение ситуации
Не следует хранить списки через запятую как значения в столбце.Это нарушает нормальные формы в базе данных.Вы должны подумать о normalization
процессе.Причина, по которой у вас возникла проблема, заключается в том, что список, разделенный запятыми, был спроектирован таким образом.Обратите внимание, что здесь нет правильного способа создания ограничения FOREIGN KEY
.
Решение
Тем не менее, поскольку вы, скорее всего, чем не можете, не сможетечтобы выполнить редизайн схемы (если возможно, хотя бы сообщите кому-нибудь, кто может избежать будущих проблем), вы можете использовать FIND_IN_SET
функцию MySQL в качестве условия JOIN
, а затем GROUP_CONCAT
свои результаты.
FIND_IN_SET(f1, f2)
возвращает позицию строки f1
в строке f2
.Если мы поставим его в условие > 0
, он вернет TRUE
, когда f1
существует в пределах f2
.
В вашем случае:
f1 == action_master.id
f2 == object_action.actions_id_list
Пример данных
create table action_master( id int, action varchar(10));
create table object_action (items varchar(10), actions_id_list varchar(15));
insert into action_master values (1,'talk'), (2,'walk'), (3,'bark'), (4,'eat'), (5,'swim');
insert into object_action values ('Human','1,2,4'),('Dog','3'),('Fish','4,5');
Запрос для получения результата
select
oa.items
, group_concat(am.action order by am.id) as actions_desc_list
from object_action oa
inner join action_master am on
find_in_set(am.id, oa.actions_id_list) > 0
group by oa.items
См. LIVE DEMO
Результат
items actions_desc_list
-------------------------
Dog bark
Fish eat,swim
Human talk,walk,eat