2012-06-09 152 views
2

我是一個mysql新手。我想將以下3個查詢和結果集合成一個,但沒有成功。查詢之間的差異在WHERE子句(kw_research.id_country =)和SELECT列(global_value,local_value,us_local_value)中。任何幫助,將不勝感激。謝謝。結合3個MySQL查詢

查詢1,

 

    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 
    kw_research.id_country = '1' 
    ORDER BY 
    dn_domains.sid ASC 

結果:

 

    +-----+------------------------+------+------------+---------------------+-------------+-------+---------------------+ 
    | sid | domain     | tld | id_keyword | keyword_name  | id_research | value | global_value  | 
    +-----+------------------------+------+------------+---------------------+-------------+-------+---------------------+ 
    | 4 | infodomain.info  | info |  13534 | info domain   |  27181 | 0.05 | 4864.859894050059 | 
    | 5 | exampledomain.com  | com |  28566 | example domain  |  28694 |  1 | 8.064000120162964 | 
    | 6 | domainexample.com  | com |  27433 | domain example  |  27503 |  1 | 14.112000210285185 | 
    | 7 | officedomain.com  | com |  27072 | office domain  |  27130 |  1 | 297.3600044310093 | 
    | 8 | extractdomain.com  | com |  27578 | extract domain  |  27680 |  1 | 6676.991976928712 | 
    +-----+------------------------+------+------------+---------------------+-------------+-------+---------------------+ 
    5 rows in set 

查詢2,

 

    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 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 = dn_tlds.country 
    ORDER BY 
    dn_domains.sid ASC 

結果:

 

    +-----+------------------------+------+------------+---------------------+-------------+-------+--------------------+ 
    | sid | domain     | tld | id_keyword | keyword_name  | id_research | value | local_value  | 
    +-----+------------------------+------+------------+---------------------+-------------+-------+--------------------+ 
    | 4 | infodomain.info  | info |  13534 | info domain   |  27181 | 0.05 | 4864.859894050059 | 
    | 5 | exampledomain.com  | com |  28566 | example domain  |  28694 |  1 | 8.064000120162964 | 
    | 6 | domainexample.com  | com |  27433 | domain example  |  27503 |  1 | 14.112000210285185 | 
    | 7 | officedomain.com  | com |  27072 | office domain  |  27130 |  1 | 297.3600044310093 | 
    | 8 | extractdomain.com  | com |  27578 | extract domain  |  27680 |  1 | 6676.991976928712 | 
    +-----+------------------------+------+------------+---------------------+-------------+-------+--------------------+ 
    5 rows in set 

查詢3,

 

    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 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 = '220' 
    ORDER BY 
    dn_domains.sid ASC 

結果:

 

    +-----+--------------------+------+------------+------------------+-------------+-------+-----------------------+ 
    | sid | domain    | tld | id_keyword | keyword_name  | id_research | value | us_local_value  | 
    +-----+--------------------+------+------------+------------------+-------------+-------+-----------------------+ 
    | 4 | infodomain.info | info |  13534 | info domain  |  13535 | 0.05 |  1415.231969178199 | 
    | 30 | domainhotspot.fr | fr |  13837 | domain hotspot |  13838 | 0.1 | 3880.8000578284264 | 
    | 72 | domainrecovery.net | net |  2931 | domain recovery |  2931 | 0.2 |  1761.177677000428 | 
    | 75 | domainburner.co | co |  16893 | domain burner |  16894 | 0.1 | 2286.1440437994006 | 
    | 82 | domainrecorder.co | co |  16969 | domain recorder |  16970 | 0.1 | 1344.6720444302562 | 
    +-----+--------------------+------+------------+------------------+-------------+-------+-----------------------+ 
    5 rows in set 

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

 

    +-----+------------------------+------+------------+---------------------+-------------+-------+-----------------------+---------------------+-----------------------+ 
    | sid | domain     | tld | id_keyword | keyword_name  | id_research | value | global_value   | local_value   | us_local_value  | 
    +-----+------------------------+------+------------+---------------------+-------------+-------+-----------------------+---------------------+-----------------------+ 
    | 4 | infodomain.info  | info |  13534 | info domain   |  27181 | 0.05 |  4864.859894050059 | 4864.859894050059 |  1415.231969178199 | 
    | 5 | exampledomain.com  | com |  28566 | example domain  |  28694 |  1 |  8.064000120162964 | 8.064000120162964 |     NULL | 
    | 6 | domainexample.com  | com |  27433 | domain example  |  27503 |  1 | 14.112000210285185 | 14.112000210285185 |     NULL | 
    | 7 | officedomain.com  | com |  27072 | office domain  |  27130 |  1 |  297.3600044310093 | 297.3600044310093 |     NULL | 
    | 8 | extractdomain.com  | com |  27578 | extract domain  |  27680 |  1 |  6676.991976928712 | 6676.991976928712 |     NULL | 
    | 30 | domainhotspot.fr  | fr |  13837 | domain hotspot  |  13838 | 0.1 |     NULL |    NULL | 3880.8000578284264 | 
    | 72 | domainrecovery.net  | net |  2931 | domain recovery  |  2931 | 0.2 |     NULL |    NULL |  1761.177677000428 | 
    | 75 | domainburner.co  | co |  16893 | domain burner  |  16894 | 0.1 |     NULL |    NULL | 2286.1440437994006 | 
    | 82 | domainrecorder.co  | co |  16969 | domain recorder  |  16970 | 0.1 |     NULL |    NULL | 1344.6720444302562 | 
    +-----+------------------------+------+------------+---------------------+-------------+-------+-----------------------+---------------------+-----------------------+ 

+0

_查詢之間的唯一區別在於WHERE子句(kw_research.id_country =)_ - 我剛剛發現那不是真的。所有三個「SELECT」列列表都不相同。 – halfer

+0

halfer - 謝謝你的評論,你是對的。我修改了我的問題。 Somnath Muluk - 感謝+1 :) –

回答

1

一個簡單的解決辦法是這樣的:

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

這裏的a demo你可以玩w第i個。

在每個查詢中,刪除ORDER BY並將其添加到最後,如上所述。這種方法將刪除查詢之間的任何重複行 - 如果想要 dup行,請使用UNION ALL而不是UNION

請記住,這可能不是最優的 - 對錶格的分析可能表明將所有作爲一個查詢編寫會更有效。

+0

我得到了這個錯誤消息:[Err] 1250 - 從一個SELECT中的表'dn_domains'不能在全局ORDER子句中使用 - 如果我刪除了ORDER子句:[Err] 1250 - 來自其中一個SELECT的表'dn_domains'不能在全局ORDER子句中使用 –

+0

您不能通過'table進行排序。列「在這種情況下 - 確保所有_columns_在每個子選擇中都正確命名,然後對其進行排序。所以,按照我的例子,如果你有一個名爲'sid'的列,你必須在'sid'上,而不是在'dn_domains.sid'上。 (你需要願意在你的最終解決方案中使用_clues_的答案,因爲你是唯一可以調試你的情況的人。) – halfer

+0

這就是說 - 在我的答案中最初的'SELECT'是錯誤的 - 道歉。我修改了它,並會添加一個插圖。 – halfer

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 
+0

假設沒有單獨的查詢會返回重複項(如果'sid'是主鍵,它必須是true),那麼你不需要'DISTINCT' - 'UNION'會爲你做這件事。 – halfer

+0

有或沒​​有DISTINCT的結果是相同的,但不幸的是local_value和us_local_value沒有顯示在結果集中。 –

+0

添加了所需的額外列。 – JHS

0

這裏的另一種方法的基礎上,再閱讀 - 你只需要一些或聲明:

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語句有點快。

+0

謝謝,halfer。你的解決方案結合了WHERE子句,但它只返回global_value,我需要3行不同的值(global_value,local_value,us_local_value)在一行中的3個不同列。 –

+0

是的,這是基於問題中的錯誤信息(關於三個查詢的不同)。其他答案是正確的。 – halfer