2015-12-26 26 views
1

我有一个整数数据存储在用户表的特定字段中。该数组表示用户所属的组。用户可以有任意数量的组。从满足条件的整数数组中获取匹配结果作为文本

表:用户

user_id | user_name | user_groups 
---------+-------------+------------- 
1  | harry  | {1,2,3} 
2  | John  | {4,5,6} 

表:团体

group_id | group_name 
------------+-------------- 
    1  | Arts 
    2  | Science 
    3  | Security 
    4  | Sports 

(赦免,它应该是一个1-N的关系)。我需要如下执行查询,

SELECT * from user where user_groups = ANY(x); 

其中x将文本值艺术,科学,安全,体育。 所以当x = Arts时,返回harry的结果。我使用的数据库是Postgresql8.4

+1

你**真的**使用Postgres 8.4?那么你应该计划升级到支持和维护版本***现在***。 –

回答

1

您可以使用@> contains操作:

SELECT * 
FROM Users 
WHERE user_groups @> (SELECT ARRAY[group_id] 
         FROM Groups 
         WHERE group_name = 'Arts') 

SqlFiddleDemo

编辑:

有什么办法通过我可以显示user_groups像 {艺术,科学,安全},而不是{1,2,3}

你可以使用相关子查询:

SELECT user_id, user_name, (SELECT array_agg(g.group_name) 
          FROM Groups g 
          WHERE ARRAY[g.group_id] <@ u.user_groups) AS user_groups 
FROM Users u 
WHERE user_groups @> (SELECT ARRAY[group_id] 
         FROM Groups 
         WHERE group_name = 'Arts') 

SqlFiddleDemo2

+0

有没有什么办法可以像'{艺术,科学,安全}一样显示'user_groups',而不是{1,2,3}? – harry

+0

@harry查看更新 – lad2025

+1

谢谢。它真的有效。优秀的答案。 – harry