簡體   English   中英

每次2張桌子上的UNION每次都會返回一個幾乎為空的結果

[英]UNION on 2 tables returns one almost empty result every time

我有一個叫做Galleries的東西,將媒體組合在一起。 該媒體可以是照片或視頻。 我將照片存儲在一個表中,將視頻存儲在另一個表中,所以我使用UNION查詢來查找屬於圖庫的照片和視頻。

我的問題似乎是我的結果包含其中一個表的空對象(無ID),換句話說,如果該表中沒有結果,它將始終為被查詢的表之一返回無用的結果。

一,查詢:

SELECT * from (
    SELECT g.id AS gallery_id,  'photo' AS type, p.id AS id, p.filename, p.caption, null AS title, null AS service, null AS embed, null AS width, null AS height, p.display_order FROM galleries g 
        LEFT OUTER JOIN photos AS p ON p.gallery_id = g.id
        WHERE g.id = {$this->id}
    UNION
    SELECT g.id AS gallery_id, 'video' AS type, v.id AS id, null AS filename, null AS caption, v.title, v.service, v.embed, v.width, v.height, v.display_order FROM galleries g 
        LEFT OUTER JOIN videos AS v ON v.gallery_id = g.id 
        WHERE g.id = {$this->id}
) AS u ORDER BY display_order;

我正在添加type列,以便可以確定返回哪種結果。 我已經清空了表之間不常見的結果。

就像我說的那樣,它可以工作,但並不完全符合預期。 如果我的畫廊只包含照片,我仍然會得到(幾乎)空的視頻結果。 結果示例:

[] => Galleries Object
    (
        [id] => 
        [name] => 
        [slug] => 
        [gallery_id] => 32
        [type] => video
        [filename] => 
        [caption] => 
        [title] => 
        [service] => 
        [embed] => 
        [width] => 
        [height] => 
        [display_order] => 
    )

[39] => Galleries Object
    (
        [id] => 39
        [name] => 
        [slug] => 
        [gallery_id] => 32
        [type] => photo
        [filename] => 39-studio-blue-pacific.jpg
        [caption] => 
        [title] => 
        [service] => 
        [embed] => 
        [width] => 
        [height] => 
        [display_order] => 1
    )

標記為[type]=>video的第一個結果為空,我稱之為它,因為它沒有視頻ID,標題,嵌入代碼等。它僅包含gallery_idtype

這是迄今為止我提出的最復雜的查詢,並且我肯定有一些遺漏之處。 如果圖庫僅包含視頻或僅包含照片,我希望結果能反映出來。

作為黑客,我可以在回顯某些內容之前檢查這些結果時是否查看ID ,但我知道可以改進查詢。 救命?

之所以返回這些結果,是因為您在表上使用了外部聯接。 嘗試以下方法:

SELECT * from (
    SELECT g.id AS gallery_id,  'photo' AS type, p.id AS id, p.filename, p.caption, null AS title, null AS service, null AS embed, null AS width, null AS height, p.display_order FROM galleries g 
        JOIN photos AS p ON p.gallery_id = g.id
        WHERE g.id = {$this->id}
    UNION
    SELECT g.id AS gallery_id, 'video' AS type, v.id AS id, null AS filename, null AS caption, v.title, v.service, v.embed, v.width, v.height, v.display_order FROM galleries g 
        JOIN videos AS v ON v.gallery_id = g.id 
        WHERE g.id = {$this->id}
) AS u ORDER BY display_order;

同樣,聽起來您從閱讀我撰寫的有關SQL的文章中可能會受益匪淺,以幫助您更好地理解這些概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM