2015-12-26 62 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