2012-07-02 2 views
0

이것은 초보자로서 지금 당장 나를 괴롭 히고 있습니다. 정확히 무엇을 찾아야할지 잘 모르겠습니다. 몇 시간의 인터넷 검색 결과 만족스러운 답변을 찾을 수 없었습니다. 나는 그 new_field_*의 약 30가, 원래의 질의에다른 하위 쿼리 (최적화)에서 WHERE IN의 하위 쿼리 결과 사용

SELECT field_a1, 
     field_a2, 
     (SELECT Count(*) 
     FROM table_b 
     WHERE field_b1 IN (SELECT field_x1 
          FROM table_x) AND field_b2 = 1) AS new_field_1, 
     (SELECT Count(*) 
     FROM table_c 
     WHERE field_c1 IN (SELECT field_x1 
          FROM table_x) AND field_c2 = 2) AS new_field_2, 
     (SELECT Count(*) 
     FROM table_d 
     WHERE field_d1 IN (SELECT field_x1 
          FROM table_x) AND field_d2 = 3) AS new_field_3 
FROM table_a 
WHERE field_a1 IN (SELECT field_x1 
        FROM table_x) 

:

내가

내가 벗겨되고 단순화 상대적으로 복잡한 쿼리가 있습니다. 모든 것이 잘 작동하는 것처럼 보이고 몇 가지 매우 만족스러운 결과 (최종 결과 및 성능)를 얻고 있습니다.

SELECT field_x1 
FROM table_x 

시간의 꽤 많은 수의 반복된다 (행 30 * 번호가 반환) 항상 WHERE IN이 경기를 찾습니다있는 세트로 사용된다

내 문제는이 쿼리는 것이다.

내 질문 :

는 한 번만이 작은 쿼리를 실행하고 그 결과를 유지하고 반복적으로 사용할 수 있습니까?

temp = (SELECT field_x1 
     FROM table_x) 
SELECT field_1 
FROM table_1 
WHERE field_1 IN temp 

또는 클라이언트 측에서 한 번이 쿼리를 실행 (웹 서버 실행 PHP) 한 후 그 결과를 추가 : 내가 생각할 수

유일한 두 (말도) 일이 (가상 솔루션) 같은 것을했다 이 같은 것을 이용하여 미래의 쿼리 :

$IN_Condition = implode(',', $stmt->execute()->fetchAll(PDO::FETCH_NUM)); 
$sql_query = "SELECT field_1 
       FROM table_1 
       WHERE field_1 IN ($IN_Condition)" 
+0

확인이 링크를. 나는 당신이 일할 생각을 갖기를 바랍니다. http://www.tutorialsp.com/mysql/mysql-temporary-tables.htm –

+0

@ V.P.Verma, 감사합니다. 나는 임시 테이블을 고려해 봤지만 각 하위 쿼리에서 여전히 SELECT를 선택해야합니다. 나는 그것이 내가 찾고있는 것이라고 생각하지 않는다. – Adi

답변

1

JOIN 절을 사용해보십시오. -

편집 :

SELECT 
    field_a1, 
    COUNT(b.field_b1) new_field_1, 
    COUNT(c.field_c1) new_field_2, 
    COUNT(d.field_d1) new_field_3 
FROM 
    table_a a 
JOIN table_x x 
    ON x.field_x1 = a.field_a1 
LEFT JOIN table_b b 
    ON b.field_b1 = x.field_x1 
LEFT JOIN table_c c 
    ON c.field_c1 = x.field_x1 
LEFT JOIN table_d d 
    ON d.field_d1 = x.field_x1 
GROUP BY 
    a.field_a1 
+0

죄송합니다. 제 질문에이 점을 자세히 설명하지 않았습니다. 'new_field_ *'를 가져 오는 것은 WHERE IN보다 더 많은 조건을 겪습니다. 그러나 +1 아이디어. – Adi

+0

DISTINCT 기능 추가 - COUNT (DISTINCT b.field_b1) ... – Devart

+0

나는 나의 문제의 복잡성 때문에 그것을 완전히 설명 할 수 없다고 생각한다. 노력해 주셔서 감사합니다. – Adi

1

은 때때로 당신은 엔진이 한 번만 데이터를 가져 오는 유사한 하위 쿼리를 볼 때, 쿼리에 대한 최적화를 수행 할 필요가 없습니다. 하지만 당신은이 쿼리를 시도하고 빠른 경우 볼 수 있습니다 : 당신은 또한 메모리에 테이블을 유지하고 PHP 엔진 데이터를 비교할 수 있습니다

SELECT a.field_a1, a.field_a2, 
    (SELECT Count(*) 
    FROM x 
    WHERE x.field_x1 = b.field_b1 
     AND b.field_b2 = 1) AS new_field_1, 
    ... 
FROM table_a, table_b b, ..., -- Query here the tables you need 
    (SELECT field_x1 
     FROM table_x) x 
WHERE field_a1 IN x 

,하지만 DB 엔진 작업을보다 느리게 될 것입니다.

편집 : 논리 역 : 당신이 필요로하는 각 테이블이 수정 2

하면 조회 할 것이다!

+0

그것은 나를위한 직관적 인 가정이었습니다 (엔진은 데이터를 한 번만 가져올 것입니다). 그러나 몇 가지 광범위한 테스트와 프로파일 링을 통해 실제로 여러 번 (30 * 행 수) 번 쿼리했습니다. – Adi

+0

여기서'x'는 임시 테이블이므로'WHERE IN' 절에서 사용할 수 없습니다. – Adi