Postgres加入查询:效率最高

时间:2014-07-30 00:24:26

标签: sql postgresql

我有一个应用程序,用户可以在其中拍摄图像并标记自己。这是数据库结构:

出于这个问题的目的,让我们采取三个主要表:

user,image,user_image

user table
id, user_name, age
1, test1, 23
2, test2, 34

image table
id, users_in_image, datetime
1, test1,test2, 03/01/2000
2, test1, 03/01/2003

user_image table
id, user_id, image_id
1, 1, 1
2, 1, 2

每次用户拍摄图像时,它会在图像,用户和user_image中创建记录,给定用户我想要查看用户已拍摄图像的所有用户以及这些图像用户是什么。

这是我的解决方案

select * from user_image where image_id
in (select image_id from user_image where user_id = '1') and user_id != '1';

我担心这不是一个好的解决方案。我想从专家那里得到一些想法。

1 个答案:

答案 0 :(得分:1)

如果你的意思是:

“查找连接到指定用户所连接图片的所有用户”

SELECT ui2.user_id
FROM   user_image ui1
JOIN   user_image ui2 USING (image_id)
WHERE  ui1.user_id =  1
AND    ui2.user_id <> 1
GROUP  BY 1;

加入桌子自己。
或者,要获得实际用户,而不仅仅是user_id

SELECT u.*
FROM  (
   SELECT ui2.user_id
   FROM   user_image ui1
   JOIN   user_image ui2 USING (image_id)
   WHERE  ui1.user_id =  1
   AND    ui2.user_id <> 1
   GROUP  BY 1
   ) ui
JOIN  "user" u ON u.id = ui.user_id;

为什么'1'周围的引号?您不是将数字存储为文本,是吗?

除此之外:不要使用保留字user作为标识符。