我有一个 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 = 1
和j = 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 = 1
和j = 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 = 2
和j = 1
:
预期:
| user_id | User Name | photo_id |
| 0 | Bob | 0 |
实际:空结果。
j = 2
和k = 2
:
预期:空结果。
实际:
| user_id | User Name | Photo ID |
| 0 | Bob | 0 |
| 1 | Ben | 20 |
如何正确解决这个问题?