2012-06-09 3 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 

Query 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 Ith.

В каждом запросе удалите ORDER BY и просто добавьте его в конец, как указано выше. Этот подход удалит любые повторяющиеся строки между запросами - если вы хотите дублировать строки, используйте UNION ALL вместо UNION.

Помните, что это может быть неоптимальным - анализ ваших таблиц может показать, что запись всего этого, поскольку один запрос будет более эффективным.

+0

Я получил это сообщение об ошибке: [Err] 1250 - Таблица «dn_domains» из одного из SELECT не может использоваться в глобальном предложении ORDER - если я удалю предложение ORDER: [Err] 1250 - Таблица «dn_domains» из одного из SELECT не может использоваться в глобальном предложении ORDER –

+0

Вы не можете заказать по таблице.column' в этом случае - просто убедитесь, что все _columns_ правильно названы в каждом подвыборке, а затем отсортируйте по этому значению. Итак, согласно моему примеру, если у вас есть столбец с именем 'sid', вы должны заказать его на' sid', а не на 'dn_domains.sid'. (Вы должны быть готовы использовать ответы здесь как _clues_ для вашего конечного решения, так как вы единственный человек, который может отлаживать вашу ситуацию.) – halfer

+0

Это говорит - первоначальный «SELECT» в моем ответе был неправильным - извинения. Я изменил его и добавлю иллюстрацию. – halfer

2

Вы можете объединить запросы с пунктом UNION и написать верхний уровень SELECT с DISTINCT что-то вроде этого -

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' является первичным ключом), тогда вам не понадобится' 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

Смежные вопросы