选择具有最相似属性集的行

时间:2015-12-20 20:36:57

标签: sql postgresql relational-division

我有一个 PostgreSQL 8.3.4 数据库来保存有关照片标记的信息。

首先,我的表定义:

create table photos (
   id integer
 , user_id integer
 , primary key (id, user_id)
); 

create table tags (
   photo_id integer
 , user_id integer
 , tag text
 , primary key (user_id, photo_id, tag)
);

我想做的事情+简单的例子:

我正在尝试返回至少 k 至少 j 常用标签的所有照片。

予。例如,如果Photo X 具有这些标签(标签表中的信息字段):

gold 
clock
family

照片 Y 有下一个标签:

gold
sun 
family
flower 

X Y 共有2个标签。对于k = 1j = 2 X Y 将被退回。

我尝试了什么

    SELECT tags1.user_id , users.name, tags1.photo_id
    FROM users, tags tags1, tags tags2
    WHERE ((tags1.info = tags2.info) AND (tags1.photo_id != tags2.photo_id)
    AND (users.id = tags1.user_id))
    GROUP BY tags1.user_id, tags1.photo_id, tags2.user_id, tags2.photo_id, users.name
    HAVING ((count(tags1.info) = <j>) and (count(*) >= <k>))
    ORDER BY user_id asc, photo_id asc

我的失败结果:

当我试图在这些桌子上运行它时:

photos

photo_id       user_id
   0             0
   1             0
   2             0
   20            1
   23            1
   10            3

tags

photo_id     user_id       tag
   0           0            Car
   0           0            Bridge
   0           0            Sky
   20          1            Car
   20          1            Bridge
   10          3            Sky

k = 1j = 1的结果:
预期:

|   user_id    |  User Name   |   photo_id   |
| 0            | Bob          | 0            |
| 1            | Ben          | 20           |
| 3            | Lev          | 10           |

实际:

|   user_id    |  User Name   |   photo_id   |
| 0            | Bob          | 0            |
| 3            | Lev          | 10           |

k = 2j = 1
预期:

|   user_id    |  User Name   |   photo_id   |
| 0            | Bob          | 0            |

实际:空结果。

j = 2k = 2
预期:空结果。

实际:

|   user_id    |  User Name   |   Photo ID   |
| 0            | Bob          | 0            |
| 1            | Ben          | 20           |

如何正确解决这个问题?

0 个答案:

没有答案