首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我怎样才能简化这个联盟?

我怎样才能简化这个联盟?
EN

Database Administration用户
提问于 2014-11-21 14:32:38
回答 2查看 178关注 0票数 2

情况如下--我有以下查询:

代码语言:javascript
运行
复制
SELECT DISTINCT post_id FROM
(
    (
        SELECT DISTINCT rp.post_id, pm.meta_value AS premiere_date
        FROM wp_related_people AS rp
        JOIN wp_posts AS p ON rp.post_id = p.ID
        JOIN wp_postmeta AS pm ON pm.post_id = p.ID
        WHERE
            rp.person_id = 494166 AND
            rp.role = 'director' AND
            pm.meta_key = 'htk_premiere_date'
        )
    UNION
    (
        SELECT DISTINCT rp.post_id, '' AS premiere_date
        FROM wp_related_people AS rp
        JOIN wp_posts AS p ON rp.post_id = p.ID
        JOIN wp_postmeta AS pm ON pm.post_id = p.ID
        WHERE
            rp.person_id = 494166 AND
            rp.role = 'director'
    )
    ORDER BY (premiere_date IS NULL), premiere_date DESC
) AS element_ids

上面的查询按照预期工作,但是,由于这两个内部选择非常相似,我想知道是否有一种方法将它们合并成一个查询?

下面是背景:这与一个WordPress数据库相关,该数据库使用自定义表进行扩展。我需要获得元素的I,按htk_premiere_date元键值排序。这个键及其值存储在具有以下列的wp_postmeta表中: meta_id (在这里不重要)、post_id、meta_key和meta_value。重点是,我需要按照以下模式对所有is进行排序:

  1. 首先,具有此htk_premiere_date密钥集并为其分配日期值(按日期排序)的ID。
  2. 第二,ID没有htk_premiere_date元值集,但是键在wp_postmeta表中有它的行。
  3. 第三,这基本上是整个问题的根源--如果post ID在wp_postmeta表中没有htk_premiere_date键的行,则应该将其视为第2点。因此,如果它有键但没有分配给它的值。

非常感谢您的帮助!

EN

回答 2

Database Administration用户

回答已采纳

发布于 2014-11-21 14:57:41

您的内部查询应该如下所示

代码语言:javascript
运行
复制
SELECT DISTINCT 
    rp.post_id, 
    CASE 
        WHEN pm.meta_key = 'htk_premiere_date' THEN pm.meta_value 
        ELSE '' 
    END
    AS premiere_date
        FROM wp_related_people AS rp
        JOIN wp_posts AS p ON rp.post_id = p.ID
        JOIN wp_postmeta AS pm ON pm.post_id = p.ID
        WHERE
            rp.person_id = 494166 AND
            rp.role = 'director'

参考文献

票数 0
EN

Database Administration用户

发布于 2014-11-21 14:39:36

在ANSI SQL中,DISTINCT在这里完全没有意义。UNION自动筛选副本:

代码语言:javascript
运行
复制
test=# SELECT 1 UNION SELECT 1;
 ?column? 
----------
        1
(1 row)

工会和工会之间存在着明显的区别:

代码语言:javascript
运行
复制
test=# SELECT 1 UNION ALL SELECT 1;
 ?column? 
----------
        1
        1
(2 rows)

在您的例子中,第二个子subselect永远不能拥有与第一个(由于空列)相同的行,所以UNION在这里已经很好了(保存一个无意义的复制过滤器)。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/83294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档