繁体   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