2010-07-21 67 views
1

好吧,我有一個子查詢,我正在嘗試使用,並需要一個複雜的問題回答。有一個SQL工具用於生成報告。使用此工具,只要日期位於外部選擇語句中,就可以選擇日期。所以,你可以使用此工具從這樣一個簡單的SELECT語句例如選擇日期範圍:MySQL之間的子查詢日期問題

select date_entered, name from opportunities 

這將很好地工作的工具。

但是,我有一個SQL需求,我需要讓每列都是它自己的SQL語句(基本上是一系列的子查詢)。我的問題是 - 無論如何有一個子查詢使用最初的選擇日期?這是我不得不做的select語句的示例:

SELECT 
(
    SELECT 
     count(
      opportunities.id) AS "count_for_opp_id" 

    FROM 
     opportunities 
LEFT JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
WHERE 
    opportunities.deleted = '0' 
AND ((curdate() - interval 0 day) <= opportunities.date_entered) 
AND opportunities_cstm.lead_category_c = 'GM Internet' 
AND opportunities_cstm.lead_type_c = 'Sales' 
AND opportunities_cstm.partner_id_c LIKE '41%' 
OR opportunities_cstm.partner_id_c LIKE '42%' 
OR opportunities_cstm.partner_id_c LIKE '43%' 
OR opportunities_cstm.partner_id_c LIKE '44%' 
OR opportunities_cstm.partner_id_c LIKE '45%' 
OR opportunities_cstm.partner_id_c LIKE '47%' 
OR opportunities_cstm.partner_id_c LIKE '48%' 
OR opportunities_cstm.partner_id_c LIKE '49%' 
OR opportunities_cstm.lead_sub_type_c = 'GM 3rd Party' 
)AS TOT_DIV_THIRD_PARTY_SALES_LEADS, 
(
SELECT 
count(opportunities.id) AS "count_for_opp_id" 
FROM 
opportunities left 
    JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
WHERE 
    opportunities.deleted = '0' 
AND ((curdate() - interval 0 day) <= opportunities.date_entered) 
AND opportunities_cstm.lead_category_c = 'Dealer Web' 
AND opportunities_cstm.lead_type_c = 'Sales' 
AND opportunities_cstm.lead_sub_type_c = 'GM Dealer Website' 
OR opportunities_cstm.lead_sub_type_c = 'DMA Landing Page' 
)AS TOT_DEALER_WEBSITE_DMA_SALES_LEADS, 
(
    SELECT 
     count(opportunities.id) AS "count_for_opp_id" 
    FROM 
     opportunities left 
    JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
JOIN leads_handling_objectives 
WHERE 
opportunities.deleted = '0' 
AND ((curdate() - interval 0 day) <= opportunities.date_entered) 
AND opportunities_cstm.lead_category_c = 'GM Internet' 
AND opportunities_cstm.partner_id_c LIKE '41%' 
OR opportunities_cstm.partner_id_c LIKE '42%' 
OR opportunities_cstm.partner_id_c LIKE '43%' 
OR opportunities_cstm.partner_id_c LIKE '44%' 
OR opportunities_cstm.partner_id_c LIKE '45%' 
OR opportunities_cstm.partner_id_c LIKE '47%' 
OR opportunities_cstm.partner_id_c LIKE '48%' 
OR opportunities_cstm.partner_id_c LIKE '49%' 
OR opportunities_cstm.lead_sub_type_c = 'GM 3rd Party' 
AND opportunities_cstm.time_followup_c <= leads_handling_objectives.resp_time_obj 
AND opportunities_cstm.make_c = leads_handling_objectives.makes_carried 
AND opportunities_cstm.time_followup_c IS NOT NULL 
)AS NUM_OF_LEADS_RESP_ONTIME_DIVISIONAL_THIRD_PARTY, 
(
    SELECT 
     count(opportunities.id) AS "count_for_opp_id" 
    FROM 
     opportunities left 
    JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
JOIN leads_handling_objectives 
WHERE 
opportunities.deleted = '0' 
AND ((curdate() - interval 0 day) <= opportunities.date_entered) 
AND opportunities_cstm.lead_category_c = 'Dealer Web' 
AND opportunities_cstm.lead_sub_type_c = 'GM Dealer Website' 
OR opportunities_cstm.lead_sub_type_c = 'DMA Landing Page' 
AND opportunities_cstm.time_followup_c <= leads_handling_objectives.resp_time_obj 
AND opportunities_cstm.make_c = leads_handling_objectives.makes_carried 
AND opportunities_cstm.time_followup_c IS NOT NULL 
)AS NUM_OF_LEADS_RESP_ONTIME_DEALERWEBSITE_DMA 

如果你看一下這個查詢,你會發現CURDATE ... < =子查詢的date_entered一部分。我需要在select語句的某個方面在外層真的有這個。但是,如果我把它放在外層,我不知道如何使子查詢使用日期範圍。

我知道這是一個複雜的問題,但是 - 有沒有人有任何建議?謝謝!

(注意:還有,這不可能是一個過程或函數它必須是一個SELECT語句或與報表工具工作視圖)

還有一個編輯 - 一個更簡單的(小)片段以上的SQL可以集中在這裏:

SELECT 
(SELECT 
     count(
      opportunities.id) AS "count_for_opp_id" 

    FROM 
     opportunities 
LEFT JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
WHERE 
    opportunities.deleted = '0' 
AND ((curdate() - interval 0 day) <= opportunities.date_entered) 
AND opportunities_cstm.lead_category_c = 'GM Internet' 
AND opportunities_cstm.lead_type_c = 'Sales' 
) AS TOT_DIV_THIRD_PARTY_SALES_LEADS 

上面這一個可能更容易閱讀,並且從長遠來看更容易診斷。

謝謝!

+1

聖shiz ... = O – NullUserException 2010-07-21 02:57:07

+0

爲什麼你有所有這些_utf8的地方?正確設置排序規則設置不容易嗎? – NullUserException 2010-07-21 02:58:28

+0

我無法糾正所有這些,但請** **瞭解何時使用括號。這太冗長了,這不會讓幫助變得簡單。這是一個噩夢維護 - 錯誤匹配的括號不會給你一個語法錯誤。 – 2010-07-21 04:00:45

回答

1

您的(小)查詢,因爲它缺少一個FROM。把一個在會給你一個鉤掛從CURDATE()函數...

SELECT (SELECT count(opportunities.id) AS "count_for_opp_id" 
      FROM opportunities LEFT JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
      WHERE opportunities.deleted    = '0' AND 
        ((curdate() - interval 0 day)  <= opportunities.date_entered) AND 
        opportunities_cstm.lead_category_c = 'GM Internet' AND 
        opportunities_cstm.lead_type_c  = 'Sales') AS TOT_DIV_THIRD_PARTY_SALES_LEADS 
    FROM any_table 
    LIMIT 1; 

第二個建議...

SELECT <given date>, 
     (SELECT count(opportunities.id) AS "count_for_opp_id" 
      FROM opportunities LEFT JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c 
      WHERE opportunities.deleted    = '0' AND 
        (<given date>      <= opportunities.date_entered AND 
        opportunities_cstm.lead_category_c = 'GM Internet' AND 
        opportunities_cstm.lead_type_c  = 'Sales') AS TOT_DIV_THIRD_PARTY_SALES_LEADS 
    FROM any_table 
    LIMIT 1; 

給定的日期可以是文字或變量,或者可以出現在any_table中;它會很好地進入子查詢。

+0

感謝您的反饋意見。不幸的是,這對於curdate不起作用,因爲子查詢仍然限於子查詢中的curdate。 我基本上需要是這樣的: 選擇,(選擇計數...從那裏opportunities.date_entered <= 機會)從機會 – swhitlow 2010-07-21 14:25:32

+0

爲TOTAL_COUNT 我做了第二個建議,但我我仍然不確定困難是什麼。在子查詢中不需要選擇日期以供其使用。 – 2010-07-21 14:34:27