2014-01-28 178 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

相關問題