2

我是一个mysql新手。我想将以下 3 个查询和结果集合二为一,但没有成功。查询之间的区别在于 WHERE 子句 (kw_research.id_country=) 和 SELECT 列 (global_value, local_value, us_local_value)。任何帮助,将不胜感激。谢谢你。

查询 1,

    选择
    dn_domains.sid,
    dn_domains.domain,
    dn_domains.tld,
    kw_keywords.id_keyword,
    kw_keywords.keyword_name,
    kw_research.id_research,
    dn_tlds.value,
    (kw_research.local_search * kw_research.aprx_cpc * '0.42' * dn_tlds.value * '12') AS global_value
    从
    ((((dn_domains)
    加入 kw_keywords)
    加入 kw_research)
    加入 dn_tlds) ,
    co_domain_keyword
    在哪里
    dn_domains.sid = co_domain_keyword.id_domain AND
    kw_keywords.id_keyword = co_domain_keyword.id_keyword AND
    kw_keywords.id_keyword = kw_research.id_keyword AND
    dn_domains.tld = dn_tlds.tld 和
    kw_research.id_country = '1'
    订购方式
    dn_domains.sid ASC

结果:

    +-----+------------+------+------------ -+----------+-------------+--------+---- -----------------+
    | 席位 | 域名 | 顶级域名 | id_keyword | 关键字名称 | id_research | 价值 | 全球价值 |
    +-----+------------+------+------------ -+----------+-------------+--------+---- -----------------+
    | 4 | infodomain.info | 信息 | 13534 | 信息域 | 27181 | 0.05 | 4864.859894050059 |
    | 5 | 示例域名.com | com | 28566 | 示例域 | 28694 | 1 | 8.064000120162964 |
    | 6 | domainexample.com | com | 27433 | 域示例 | 27503 | 1 | 14.112000210285185 |
    | 7 | officedomain.com | com | 27072 | 办公域名 | 27130 | 1 | 297.3600044310093 |
    | 8 | extractdomain.com | com | 27578 | 提取域 | 27680 | 1 | 6676.991976928712 |
    +-----+------------+------+------------ -+----------+-------------+--------+---- -----------------+
    5行一组

查询 2,

    选择
    dn_domains.sid,
    dn_domains.domain,
    dn_domains.tld,
    kw_keywords.id_keyword,
    kw_keywords.keyword_name,
    kw_research.id_research,
    dn_tlds.value,
    (kw_research.local_search * kw_research.aprx_cpc * '0.42' * dn_tlds.value * '12') AS local_value
    从
    ((((dn_domains)
    加入 kw_keywords)
    加入 kw_research)
    加入 dn_tlds) ,
    co_domain_keyword
    在哪里
    dn_domains.sid = co_domain_keyword.id_domain AND
    kw_keywords.id_keyword = co_domain_keyword.id_keyword AND
    kw_keywords.id_keyword = kw_research.id_keyword AND
    dn_domains.tld = dn_tlds.tld 和
    kw_research.id_country = dn_tlds.country
    订购方式
    dn_domains.sid ASC

结果:

    +-----+------------+------+------------ -+----------+-------------+--------+---- ----------------+
    | 席位 | 域名 | 顶级域名 | id_keyword | 关键字名称 | id_research | 价值 | 本地值 |
    +-----+------------+------+------------ -+----------+-------------+--------+---- ----------------+
    | 4 | infodomain.info | 信息 | 13534 | 信息域 | 27181 | 0.05 | 4864.859894050059 |
    | 5 | 示例域名.com | com | 28566 | 示例域 | 28694 | 1 | 8.064000120162964 |
    | 6 | domainexample.com | com | 27433 | 域示例 | 27503 | 1 | 14.112000210285185 |
    | 7 | officedomain.com | com | 27072 | 办公域名 | 27130 | 1 | 297.3600044310093 |
    | 8 | extractdomain.com | com | 27578 | 提取域 | 27680 | 1 | 6676.991976928712 |
    +-----+------------+------+------------ -+----------+-------------+--------+---- ----------------+
    5行一组

查询 3,

    选择
    dn_domains.sid,
    dn_domains.domain,
    dn_domains.tld,
    kw_keywords.id_keyword,
    kw_keywords.keyword_name,
    kw_research.id_research,
    dn_tlds.value,
    (kw_research.local_search * kw_research.aprx_cpc * '0.42' * dn_tlds.value * '12') AS us_local_value
    从
    ((((dn_domains)
    加入 kw_keywords)
    加入 kw_research)
    加入 dn_tlds) ,
    co_domain_keyword
    在哪里
    dn_domains.sid = co_domain_keyword.id_domain AND
    kw_keywords.id_keyword = co_domain_keyword.id_keyword AND
    kw_keywords.id_keyword = kw_research.id_keyword AND
    dn_domains.tld = dn_tlds.tld 和
    kw_research.id_country = '220'
    订购方式
    dn_domains.sid ASC

结果:

    +-----+--------+------+------------+-- ----------------+-------------+-------+------------ ------------+
    | 席位 | 域名 | 顶级域名 | id_keyword | 关键字名称 | id_research | 价值 | us_local_value |
    +-----+--------+------+------------+-- ----------------+-------------+-------+------------ ------------+
    | 4 | infodomain.info | 信息 | 13534 | 信息域 | 13535 | 0.05 | 1415.231969178199 |
    | 30 | domainhotspot.fr | 法语 | 13837 | 域名热点 | 13838 | 0.1 | 3880.8000578284264 |
    | 72 | domainrecovery.net | 净 | 2931 | 域恢复 | 2931 | 0.2 | 1761.177677000428 |
    | 75 | domainburner.co | 合作 | 16893 | 域名刻录机 | 16894 | 0.1 | 2286.1440437994006 |
    | 82 | domainrecorder.co | 合作 | 16969 | 域名记录器 | 16970 | 0.1 | 1344.6720444302562 |
    +-----+--------+------+------------+-- ----------------+-------------+-------+------------ ------------+
    5行一组

但是,我需要以下结果集:

    +-----+------------+------+------------ -+----------+-------------+--------+---- --------------------+---------------------+-------- ---------------+
    | 席位 | 域名 | 顶级域名 | id_keyword | 关键字名称 | id_research | 价值 | 全球价值 | 本地值 | us_local_value |
    +-----+------------+------+------------ -+----------+-------------+--------+---- --------------------+---------------------+-------- ---------------+
    | 4 | infodomain.info | 信息 | 13534 | 信息域 | 27181 | 0.05 | 4864.859894050059 | 4864.859894050059 | 1415.231969178199 |
    | 5 | 示例域名.com | com | 28566 | 示例域 | 28694 | 1 | 8.064000120162964 | 8.064000120162964 | 空 |
    | 6 | domainexample.com | com | 27433 | 域示例 | 27503 | 1 | 14.112000210285185 | 14.112000210285185 | 空 |
    | 7 | officedomain.com | com | 27072 | 办公域名 | 27130 | 1 | 297.3600044310093 | 297.3600044310093 | 空 |
    | 8 | extractdomain.com | com | 27578 | 提取域 | 27680 | 1 | 6676.991976928712 | 6676.991976928712 | 空 |
    | 30 | domainhotspot.fr | 法语 | 13837 | 域名热点 | 13838 | 0.1 | 空 | 空 | 3880.8000578284264 |
    | 72 | domainrecovery.net | 净 | 2931 | 域恢复 | 2931 | 0.2 | 空 | 空 | 1761.177677000428 |
    | 75 | domainburner.co | 合作 | 16893 | 域名刻录机 | 16894 | 0.1 | 空 | 空 | 2286.1440437994006 |
    | 82 | domainrecorder.co | 合作 | 16969 | 域名记录器 | 16970 | 0.1 | 空 | 空 | 1344.6720444302562 |
    +-----+------------+------+------------ -+----------+-------------+--------+---- --------------------+---------------------+-------- ---------------+

4

3 回答 3

2

您可以将查询与子句结合起来,并使用类似这样的内容UNION编写顶级-SELECTDISTINCT

SELECT dn_domains.sid,
       dn_domains.domain,
       dn_domains.tld,
       kw_keywords.id_keyword,
       kw_keywords.keyword_name,
       kw_research.id_research,
       dn_tlds.value,
       CASE WHEN kw_research.id_country = '1' THEN
       (kw_research.local_search * kw_research.aprx_cpc * '0.42' * dn_tlds.value * '12') 
       ELSE NULL END AS global_value,
       (kw_research.local_search * kw_research.aprx_cpc * '0.42' * dn_tlds.value * '12') AS local_value,
       CASE WHEN kw_research.id_country = '220' THEN
       (kw_research.local_search * kw_research.aprx_cpc * '0.42' * dn_tlds.value * '12') 
       ELSE NULL END AS us_local_value
FROM (((dn_domains
        JOIN kw_keywords)
        JOIN kw_research)
        JOIN dn_tlds) ,
      co_domain_keyword
WHERE dn_domains.sid = co_domain_keyword.id_domain AND
      kw_keywords.id_keyword = co_domain_keyword.id_keyword AND
      kw_keywords.id_keyword = kw_research.id_keyword AND
      dn_domains.tld = dn_tlds.tld AND
      (kw_research.id_country IN (1, 220) OR kw_research.id_country = dn_tlds.country)
ORDER BY dn_domains.sid ASC
于 2012-06-09T11:21:31.900 回答
1

一个简单的解决方案是:

(
    SELECT ... /* i.e. query 1 */
)
UNION (
    SELECT ... /* i.e. query 2 */
)
UNION (
    SELECT ... /* i.e. query 3 */
)
ORDER BY
    sid

这是一个你可以玩的演示。

在每个查询中,删除ORDER BY并将其添加到末尾,如上所述。这种方法将删除查询之间的任何重复行 - 如果您想要dup 行,请使用UNION ALL而不是UNION.

请记住,这可能不是最佳选择 - 对表的分析可能表明将其全部编写为一个查询会更有效。

于 2012-06-09T11:21:19.697 回答
0

这是另一种方法,基于重新阅读您的问题 - 您只需要一些 OR 语句:

SELECT
dn_domains.sid,
dn_domains.domain,
dn_domains.tld,
kw_keywords.id_keyword,
kw_keywords.keyword_name,
kw_research.id_research,
dn_tlds.value,
(
    kw_research.local_search *
    kw_research.aprx_cpc * '0.42' *
    dn_tlds.value * '12'
) AS global_value
FROM
(((dn_domains
JOIN kw_keywords)
JOIN kw_research)
JOIN dn_tlds) ,
co_domain_keyword
WHERE
dn_domains.sid = co_domain_keyword.id_domain AND
kw_keywords.id_keyword = co_domain_keyword.id_keyword AND
kw_keywords.id_keyword = kw_research.id_keyword AND
dn_domains.tld = dn_tlds.tld AND
( /* Here's the new clause */
    kw_research.id_country IN (1, 220) OR
    kw_research.id_country = dn_tlds.country
)
ORDER BY
dn_domains.sid ASC

我假设 id_country 是一个整数,因此将数字文字从字符串转换为数字。我也用过,比多条语句IN要快一点。OR

于 2012-06-09T15:05:56.100 回答