2011-08-02 8 views
1

두 개의 테이블 (리드 및 브로셔)이 있습니다. 각 판매 리드는 0 개 이상의 브로셔를 요청할 수 있습니다.MySQL 계산/동적 열 또는 하위 쿼리 참조

SELECT 
    id, 
    (SELECT COUNT(*) FROM brochures WHERE lead = l.id) AS 'BrochureCount' 
FROM leads l 
WHERE 
    (SELECT COUNT(*) FROM brochures WHERE lead = l.id) > 0 
: 나는 일부 브로셔를 요청한 리드를 표시 할 경우

SELECT 
    id, 
    (SELECT COUNT(*) FROM brochures WHERE lead = l.id) AS 'BrochureCount' 
FROM leads l 

, 나는 WHERE 절에 하위 쿼리를 반복 할 수 있습니다 : 나는 리드 당 요청 브로셔의 수를 얻기 위해 다음 쿼리를 작성할 수 있습니다

하지만 하위 쿼리를 두 번 실행하면 쿼리 속도가 훨씬 느려질 수 있습니다.

BrochureCount을 WHERE 절에서 이름, 열 번호 또는 다른 형식으로 참조 할 수 있습니까? 시간에 대한

감사합니다,

아담

+1

에 해당합니다! –

답변

1

그것을 할 수 없다는 것을 알아라.

이 항목을 열 별칭이라고하며 WHERE 절에 사용할 수없는 것 같습니다. MySQL docs에서 :

표준 SQL을 사용하면 WHERE 절에 열 별칭을 참조 할 수 없습니다. WHERE 코드가 일 때 열 값이 아직 결정되지 않았기 때문에이 제한이 적용됩니다.

0

리드 그들이 주문한 얼마나 많은 브로셔, 적어도 한 경우 :

SELECT 
    leads.id, 
    COUNT(brochures.lead) AS `BrochureCount` 
FROM 
    leads 
INNER JOIN 
    brochures 
ON 
    leads.id = brochures.lead 
GROUP BY 
    leads.id 

당신은 모든 리드를 원한다면 및 브로셔는 경우에도 계산 관련 브로슈가 0 개 있습니다.

SELECT 
    leads.id, 
    COUNT(brochures.lead) AS `BrochureCount` 
FROM 
    leads 
LEFT OUTER JOIN 
    brochures 
ON 
    leads.id = brochures.lead 
GROUP BY 
    leads.id 
+0

시간 내 주셔서 감사합니다. 필자는 계산 된 열을 참조하는 방법을 특히 따랐습니다. 예제는 제가 아주 기본적인 예제였습니다. 제가 작성한 쿼리는 훨씬 더 복잡하고 계산 된 열이나 하위 쿼리가 많이 있습니다. –

+0

좀 더 적용 가능한 대답을 원한다면 실제 질의를 게시하십시오. 가능한 많은 쿼리 영역에서 포괄적 인 대답은 없습니다. 실제로 매우 복잡한 종속 서브 쿼리조차도 조인과 집계로 다시 작성 될 수 있습니다 (MySQL의 경우 성능 향상은 하위 쿼리보다 조인이 더 잘되는 경향이 있기 때문에 성능 향상). –

+0

예를 들어, 나는 최근 일반 사용자 및 이벤트 (사람들이 한 일들) 데이터 세트에 대해 일대일 분석을 수행하는 쿼리를 작성했습니다.이는 모든 사람들을 일/주/월별로 그룹화하여 처음에 어떤 이벤트를 수행 한 다음 그 그룹의 몇 퍼센트가 다음 1,2,3,4,5,6 및 7 일 동안 동일한 이벤트 유형을 다시 수행했는지를 결정한다는 것을 의미합니다. 주/월. 일정 기간 동안 7 개의 동질 집단을 만들어 최대 7 개의 기간 동안 추적하고 각 기간에 대해 여전히 활동중인 비율을 결정하려고합니다. 이것은 이동하는 날짜 - 레벨 그룹의 두 레벨입니다 ... –

0

는 다음을 시도해보십시오

SELECT id, BrochureCount 
FROM(
    SELECT id, (SELECT COUNT(*) FROM brochures WHERE lead = l.id) AS 'BrochureCount' 
    FROM leads l) data 
Where data.BrochureCount > 0 
0

가장 straighforward 방법은 계산 열이 HAVING 절 함께 참조 할 수 있습니다. 일반적으로 :

<subquery> HAVING <expression> 

쿼리 계획이 조인으로 다시 작성할 수없는 경우, 하위 쿼리가 리드가 있기 때문에뿐만 아니라 두 번, 여러 번으로 해결 될

SELECT * from (<subquery>) WHERE <expression> 
+0

고마워요,하지만 그건 내 질문에 대답하지 않습니다. –