MySQL查询从另一个表的值列表中获取值

时间:2019-04-29 13:40:27

标签: mysql sql

我有一个表,以逗号分隔的形式存储项目的操作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。

1 个答案:

答案 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