2

私はmysqlの初心者です。次の 3 つのクエリと結果セットを 1 つに結合したいのですが、うまくいきません。クエリ間の違いは、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') グローバル値として
    から
    (((dn_domains
    JOIN kw_keywords)
    参加する kw_research)
    JOIN 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 AND
    kw_research.id_country = '1'
    オーダーバイ
    dn_domains.sid ASC

結果:

    +-----+------------------------+------+----------- --------------------------------------+-------------+-------+---- ------------------+
    | | シド | ドメイン | tld | id_keyword | キーワード名 | id_research | 値 | グローバル値 |
    +-----+------------------------+------+----------- --------------------------------------+-------------+-------+---- ------------------+
    | | 4 | infodomain.info | 情報 | 13534 | 情報ドメイン | 27181 | 0.05 | 4864.859894050059 |
    | | 5 | exampledomain.com | コム| 28566 | 例のドメイン | 28694 | 1 | 8.064000120162964 |
    | | 6 | domainexample.com | コム| 27433 | ドメインの例 | 27503 | 1 | 14.112000210285185 |
    | | 7 | officedomain.com | コム| 27072 | オフィス ドメイン | 27130 | 1 | 297.3600044310093 |
    | | 8 | 抽出ドメイン.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
    JOIN kw_keywords)
    参加する kw_research)
    JOIN 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 AND
    kw_research.id_country = dn_tlds.country
    オーダーバイ
    dn_domains.sid ASC

結果:

    +-----+------------------------+------+----------- --------------------------------------+-------------+-------+---- ----------------+
    | | シド | ドメイン | tld | id_keyword | キーワード名 | id_research | 値 | ローカル値 |
    +-----+------------------------+------+----------- --------------------------------------+-------------+-------+---- ----------------+
    | | 4 | infodomain.info | 情報 | 13534 | 情報ドメイン | 27181 | 0.05 | 4864.859894050059 |
    | | 5 | exampledomain.com | コム| 28566 | 例のドメイン | 28694 | 1 | 8.064000120162964 |
    | | 6 | domainexample.com | コム| 27433 | ドメインの例 | 27503 | 1 | 14.112000210285185 |
    | | 7 | officedomain.com | コム| 27072 | オフィス ドメイン | 27130 | 1 | 297.3600044310093 |
    | | 8 | 抽出ドメイン.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
    JOIN kw_keywords)
    参加する kw_research)
    JOIN 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 AND
    kw_research.id_country = '220'
    オーダーバイ
    dn_domains.sid ASC

結果:

    +-----+--------------------+------+------------+-- -+-------------+-------+----------- ------------+
    | | シド | ドメイン | tld | 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 | ドメインバーナー.co | コ | 16893 | ドメイン バーナー | 16894 | 0.1 | 2286.1440437994006 |
    | | 82 | domainrecorder.co | コ | 16969 | ドメインレコーダー | 16970 | 0.1 | 1344.6720444302562 |
    +-----+--------------------+------+------------+-- -+-------------+-------+----------- ------------+
    5列セット

ただし、次の結果セットが必要です。

    +-----+------------------------+------+----------- --------------------------------------+-------------+-------+---- -------------------+---------------------+-------- ---------------+
    | | シド | ドメイン | tld | id_keyword | キーワード名 | id_research | 値 | グローバル値 | ローカル値 | us_local_value |
    +-----+------------------------+------+----------- --------------------------------------+-------------+-------+---- -------------------+---------------------+-------- ---------------+
    | | 4 | infodomain.info | 情報 | 13534 | 情報ドメイン | 27181 | 0.05 | 4864.859894050059 | 4864.859894050059 | 1415.231969178199 |
    | | 5 | exampledomain.com | コム| 28566 | 例のドメイン | 28694 | 1 | 8.064000120162964 | 8.064000120162964 | ヌル |
    | | 6 | domainexample.com | コム| 27433 | ドメインの例 | 27503 | 1 | 14.112000210285185 | 14.112000210285185 | ヌル |
    | | 7 | officedomain.com | コム| 27072 | オフィス ドメイン | 27130 | 1 | 297.3600044310093 | 297.3600044310093 | ヌル |
    | | 8 | 抽出ドメイン.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 | ドメインバーナー.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

1 つの簡単な解決策は次のとおりです。

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

これはあなたが遊ぶことができるデモです。

上記のように、各クエリで を削除ORDER BYして最後に追加します。このアプローチにより、クエリ間の重複行が削除されます。重複行が必要な場合は代わりUNION ALLUNION.

これは最適ではない可能性があることに注意してください。テーブルを分析すると、すべてを 1 つのクエリとして記述した方が効率的であることがわかる場合があります。

于 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 に答える