【问题标题】:Postgres join query: Most efficientPostgres 连接查询:最有效
【发布时间】:2014-07-31 05:20:06
【问题描述】:

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

为了解决这个问题,让我们来看看三个主要的表:

用户,图像,用户图像

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

每次用户拍摄图像时,它都会在 image、user 和 user_image 中创建一个记录,给定一个用户,我想查看该用户与之拍摄图像的所有用户以及这些 image_id 是什么。

这是我的解决方案

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

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

【问题讨论】:

  • 图片表中users_in_image字段是一个数组吗?
  • 不,不幸的是,它的逗号分隔文本数据库不是这样设计的。
  • 找到设计它的人并用线索蝙蝠敲打他们。轻轻地。
  • 您的问题是什么?你试过什么?显示示例结果。等
  • 您的问题可能不应该是“最有效”的标题,因为您甚至根本没有解决方案。

标签: sql postgresql


【解决方案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 作为标识符。

【讨论】:

  • 我要做的是给定一个用户,谁是该用户与之合影的其他用户。
  • 但是为什么我们要使用AND ui2.user_id &lt;&gt; 2 来查询只应该传入一个userId。假设从web 角度来看,少数用户登录1 登录...
  • @Null-Hypothesis:抱歉,打错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2015-09-23
  • 2019-07-01
  • 1970-01-01
  • 2014-02-26
  • 2014-10-27
  • 1970-01-01
相关资源
最近更新 更多