2014-01-28 126 views
0

在开始我想说,我不知道主题的名称,所以如果任何人有建议改进它,请输入您的建议。PostgreSQL - 从表中知道记录ID从另一个表中选择所有记录,并显示其他列

这里是我的SQL查询来创建数据库的结构完全一样矿山:

CREATE TABLE display_campaign (
    files_id integer[] DEFAULT '{-1}' NOT NULL, 
    campaign_id integer NOT NULL, 
    files_display_length integer[] DEFAULT '{-1}' NOT NULL 
) 

CREATE TABLE display_files (
    file_id integer NOT NULL, 
    files_source text NOT NULL, 
    files_display_name text NOT NULL 
) 

我已经创建了一个从“display_files”表中根据“files_id” FROM“display_campaign”选择我的文件查询基于 “CAMPAIGN_ID”

SELECT * FROM "display_files" WHERE array["file_id"] && ANY(SELECT "files_id" FROM "display_campaigns" WHERE "campaign_id" = '1') 

实施例结果表看起来像

file_id | file_source | file_display_name 
--------+-----------------+------------------ 
     1| {PLAYLIST}/1.mp4|    ADV1 
     3| {PLAYLIST}/2.mp4|    ADV2 

我喜欢那样:

file_id | file_source | file_display_name|file_display_length 
--------+-----------------+------------------+------------------- 
     1| {PLAYLIST}/1.mp4|    ADV1|    10000 
     3| {PLAYLIST}/2.mp4|    ADV2|    17000 

有什么建议吗?

@编辑: files_id和files_display_length索引是相同的。这意味着files_display_length [0]是files_id [0]的属性等。

+0

是否有你在'display_campaign'内使用file_ids数组而不是每个文件都与其活动关联的原因?会使查询和结构更容易,更不容易出错IMO。这看起来有点像过度复杂的事情,我们不知道结构背后的原因。 – DrColossos

+0

每个广告系列都有几个文件可以显示。这就是为什么它是一个数组。 – Doro

+0

我看到,更常见的多对多表格方法看起来像是对问题的更好解决方案,并且会产生更好,或许更有效的查询。 – DrColossos

回答

1

您需要加入这些表。 display_campaign.files_id是否等于display_files.file_id?

SELECT df.*, files_display_length FROM display_files df join 
display_campaign dc on df.file_id = dc.files_id 
WHERE dc.campaign_id = '1' 
+0

错误消息是: ERROR:操作者不存在:整数=整数[] LINE 2:display_campaigns直流df.file_id = dc.files_id ^ HINT:没有操作者给定的名称和参数类型(匹配小号)。您可能需要添加明确的类型转换。' 正如您在结构中看到的那样display_campaign.files_id包含整数数组 – Doro

+0

由于我无法编辑我以前的评论,我设法做了“半解决方案” 'SELECT df 。*,files_display_length FROM display_files df join display_campaigns dc on array [df.file_id] && dc.files_id WHERE dc.campaign_id ='3''但它显示file_display_length列中的数组,我想避免在列中显示数组,因为您可以在示例中看到 – Doro

+0

尝试将dc.campaign_id作为where子句中的文本 - WHERE dc.campaign_id :: text ='1',或者使'1'为整数。 dc.campaign_id = 1 – selfbusser

相关问题