2014-10-29 68 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