2012-11-09 1 views
0

필자는 테이블에서 모든 ID를 선택하여 일부 ID를 'backblaze sales orders'로 필터링하도록 비교합니다. 보고서를 확인할 때마다 10 초가 걸린다는 것을 알았습니다. 얼마나 효율적으로 테이블을 반복해서 쿼리하지 않도록 비교할 수있는 변수로 테이블을 선택할 수 있습니까?두 번 사용할 수 있도록 쿼리를 변수에 저장하려면 어떻게해야합니까?

지금까지 나는 폴 응답의 temp_table을 사용했지만 "재 테스트 할 수는 없습니다"라는 오류 메시지가 나타납니다.

CREATE TEMPORARY TABLE if not exists TempTable (id varchar(36)); 
INSERT INTO TempTable (id) 
SELECT 
    id 
FROM 
    reporting.backblaze_sales_orders; 
SELECT 
    2011 as year, 
    so.technical_address_country, 
    so.technical_address_state, 
    /* ALL JOBs */ 
    COUNT(so.id) as all_sales, 
    COUNT(mf.id) as all_jobs, 
    SUM(so.total_value) as all_value, 
    SUM(IF(so.check_if_new_customer=1,1,0)) as sales_order_new, 
    SUM(IF(so.check_if_new_customer = 1,so.total_value,0)) as total_value_new, 
    SUM(IF(so.check_if_new_customer=1 AND mf.id IS NOT NULL,1,0)) as jobs_new, 
    SUM(IF(so.check_if_new_customer=0,1,0)) as sales_order_existing, 
    SUM(IF(so.check_if_new_customer = 0,so.total_value,0)) as total_value_existing, 
    SUM(IF(so.check_if_new_customer=0 AND mf.id IS NOT NULL,1,0)) as jobs_existing, 
     /* ALL JOBs */ 
    COUNT(so.id) as all_sales_back_blaze, 
    COUNT(mf.id) as all_jobs_back_blaze, 
    SUM(so.total_value) as all_value, 
    SUM(IF(so.check_if_new_customer=1 AND so.id not in (SELECT id from TempTable) ,1,0)) as sales_order_new_back_blaze, 
    SUM(IF(so.check_if_new_customer = 1 AND so.id not in (SELECT id from TempTable),so.total_value,0)) as total_value_new_back_blaze, 
    SUM(IF(so.check_if_new_customer=1 AND mf.id IS NOT NULL AND so.id not in (SELECT id from TempTable),1,0)) as jobs_new_back_blaze, 
    SUM(IF(so.check_if_new_customer=0 AND so.id not in (SELECT id from TempTable),1,0)) as sales_order_existing_back_blaze, 
    SUM(IF(so.check_if_new_customer = 0 AND so.id not in (SELECT id from TempTable),so.total_value,0)) as total_value_existing_back_blaze, 
    SUM(IF(so.check_if_new_customer=0 AND mf.id IS NOT NULL AND so.id not in (SELECT id from TempTable),1,0)) as jobs_existing_back_blaze 
FROM 
    sugarcrm2.so_order so 
LEFT JOIN 
    sugarcrm2.mf_job mf on so.id = mf.sales_order_id 
WHERE 
    so.date_entered > "2010-10-30" AND so.date_entered >"2011-10-30" AND 
    so.technical_address_country IS NOT NULL AND 
    so.technical_address_state IS NOT NULL AND 
    so.deleted = 0 AND 
    so.has_been_promoted = 1 
GROUP BY 
    YEAR(so.date_entered), 
    so.technical_address_country, 
    so.technical_address_state 
ORDER BY 
    so.technical_address_country, so.technical_address_state 

답변

0

대답은 단순히 해당 테이블에 조인하고 조인 된 테이블의 ID가 null인지 아닌지 테스트하는 것입니다.

2

코드를 전부 읽지는 않았지만 임시 테이블이 필요한 것 같습니다. 다음과 같이 사용할 수 있습니다.

CREATE TEMPORARY TABLE TempTable (id int, otherValue varchar(100)); 

INSERT INTO TempTable (id, otherValue) 
SELECT 
    id, 
    someOtherValue 
FROM .... 

그런 다음 쿼리 대신이 테이블을 사용하십시오. http://www.brainbell.com/tutorials/MySQL/Working_With_Cursors.htm

DECLARE ordernumbers CURSOR 
    FOR 
    SELECT ordernum FROM orders; 

이 그냥 힌트 :

+0

첫 번째 대답은 MSSQL에서만 작동하며 MySQL 용으로 업데이트되었습니다. –

+0

이 테이블을 어떻게 쿼리합니까? – davidahines

+0

그래서 당신이 제안한 것처럼 유혹을 사용하려고 쿼리를 변경했지만 '유인'이 이미 있다는 것을 알려주므로 'temptable1'로 변경하고 나에게도 같은 오류가 발생합니다. 편집 된 예제에서 코드 상단에 있습니다. – davidahines

1

는 커서를 사용! 누군가가 완전한 대답을주기 위해 그것을 사용할 수 있기를 바랍니다.

+0

그럼이 select를 어떻게 취해서 위의 쿼리에서 사용할 수있는 것으로 만들 수 있습니까? SET @var : = (reporting.table의 SELECT id)를 사용하여 위 쿼리를 수행 할 때 하위 쿼리가 두 개 이상의 행을 반환한다고 불평합니다. – davidahines

+0

테이블의 모든 ID를 선택하려고합니다. – davidahines

+1

괜찮 았으면 커서를 사용해야합니다 .. – Vloxxity

관련 문제