我有一个表,以逗号分隔的形式存储项目的操作ID列表,现在我想用MySQL查询从逗号分隔的形式的ID获取描述列表。
我有两个表:
table1: action_master table2: object_action
id action items actions_id_list
------------- ---------------------------
1 talk Human 1,2,4
2 walk Dog 3
3 bark Fish 4,5
4 eat
5 swim
现在,我想编写一个选择查询,该查询可以产生如下输出:
items actions_desc_list
-----------------------------
Human talk,walk,eat
Dog bark
Fish eat,swim
注意:我没有选择将动作描述列表直接存储在object_action表中。我必须使用ID。
答案 0 :(得分:2)
对情况的一般考虑
您不应将逗号分隔的列表作为值存储在列中。这会破坏数据库中的正常形式。您应该考虑normalization
流程。您现在遇到问题的原因是因为首先用这种方式设计了逗号分隔的列表。请注意,这里也没有适当的方法来创建FOREIGN KEY
约束。
解决方案
也就是说,由于您很有可能无法执行架构重新设计(如果可能,至少请告知可以避免将来出现问题的人),您可以将FIND_IN_SET
MySQL函数用作{{1 }}条件,然后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');
请参见 LIVE DEMO
结果
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