如何在SQL中获取MultiValued属性

时间:2015-06-04 07:14:36

标签: mysql sql

我想从user_info表中获取所有admin用户。在user_info表中,groups列为多值属性。我试过的是:

 select * from user_info where 'admin' IN Split(',',groups);

我收到此错误:

  

1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以获得正确的语法   靠近'Split(',',groups)

user_info表

username     |   groups         |
---------------------------------
ABC@mail.com |   superadmin,admin

分组表

 groupID(AutoIncr)     |   groups         |
---------------------------------
1                      |   superadmin     |
2                      |   admin          |

2 个答案:

答案 0 :(得分:1)

对于您的解决方案,这是一个有效的查询

从user_info中选择*,其中find_in_set('admin',groups);

见这里:http://sqlfiddle.com/#!9/97c4b/1

<强> BUT

你不应该使用你的表格结构。如果你可以改变它,改变它!规范化您的架构,您将遇到更少的问题和更好的性能!

在您的情况下,您应该使用这样的架构

create table users (
  id int primary key auto_increment,
  username varchar(255))
  ;

  insert into users (id, username) values (1, 'ABC@mail.com');

  create table groups (
    id int primary key auto_increment,
    name varchar(255)

  );

  insert into groups (id, name) values (1, 'superadmin');
  insert into groups (id, name) values (2, 'admin');


create table user_groups (
  user_id int,
  group_id int
);

insert into user_groups (user_id, group_id) values (1,1);
insert into user_groups (user_id, group_id) values (1,2);

然后你可以选择

select * from users u
join user_groups ug on (ug.user_id = u.id)
join groups g on (ug.group_id = g.groupid)
where g.name = 'admin';

见这里:http://sqlfiddle.com/#!9/b82fa/2

答案 1 :(得分:0)

你可以尝试:

select * 
  from user_info
  where find_in_set('admin', groups);
实际上,这是一个围绕着根本破坏的设计的拐杖。