2014-10-29 66 views
3

我有兩個表標記和使用者PostgreSQL的JOIN與陣列型與數組元素

表名稱:標籤

| id | name | 
| 1 | one | 
| 2 | two | 
| 3 | three | 
| 4 | four | 
| 5 | five | 

表名:用戶

| id | fname | tags  | 
| 1 | Ram | {1,5}  | 
| 2 | Sham | {1,2,3,4} | 
| 3 | Bham | {1,3}  | 
| 4 | Kam | {5,2}  | 
| 5 | Lam | {4,2}  | 

預期輸出:

| id | fname | tags     | 
| 1 | Ram | one, five    | 
| 2 | Sham | one, two, three, four | 
| 3 | Bham | one, three   | 
| 4 | Kam | five, two    | 
| 5 | Lam | four, two    | 

試用1:使用JOI ñ

SELECT I.id, I.fname, I.tags, J.name FROM users I 
JOIN tags J ON J.id = ANY(I.cached_tag_ids) 
LIMIT 1 

結果:

| id | fname | tags | 
| 1 | Ram | one | 
| 1 | Ram | five | 

預計:

| id | fname | tags  | 
| 1 | Ram | one, five | 
+0

第一行中不要你的意思是一,五 – Mihai 2014-10-29 18:41:15

+0

是的,對不起我的錯誤 – 2014-10-29 18:57:50

回答

2

tags應該有一個INTEGER[]類型。

CREATE TABLE users(
    id SERIAL, 
    fname VARCHAR(50), 
    tags INTEGER[] 
); 

然後,

SELECT I.id, I.fname, array_agg(J.name) 
FROM users I 
LEFT JOIN tags J 
ON J.id = ANY(I.tags) 
GROUP BY fname,I.id ORDER BY id 

應該工作。見sqlfiddle

question可能會有所幫助。

+0

我使用相同的查詢創建用戶表... SELECT I.id,I.fname,I.tags,J.名稱FROM用戶I JOIN標記J ON J.id = ANY(I.tags)LIMIT 1 您提供的SELECT查詢返回 | id | fname |標籤| | 1 | Ram | one | | 1 | Ram |兩個| – 2014-10-29 18:53:12

+0

編輯查詢 – 2014-10-29 18:59:47

+0

@Umega新增sqlfiddle – 2014-10-29 19:04:29