2012-05-16 2 views
1
select id, name, 'First Category' as category, count(id) as totalCalls 
from missed_call 
where name = 'whatever1' 
group by name, category 
UNION 
select id, name, 'Second Category' as category, count(id) as totalCalls 
from missed_call 
where name = 'whatever2' 
group by name, category 
order by name ASC, totalCalls DESC 

내가 레코드와 현재를 얻기 위해 어떻게 할 수 totalCalls 그래서 0SQL 쿼리는 기록을 얻을 수 0 표 하나

입니다 레코드를 검색 할 것입니다 이전 쿼리, totalCalls 0으로?

UPDATE : 나는 IFNULL(count(id), 0) as totalCalls에 대한 count(id) as totalCalls을 변경 시도했지만 그것은 문제가 해결되지 않습니다. 아마, count (id)가 실제로 null이 아니기 때문에, 그것은 단지 존재하지 않습니다.

+0

질문이 구체적이지 않습니다. 내 가정 : 범주를 기반으로 총 호출 수를 계산하는 경우 GROUP BY를 사용할 수 있습니다. – Godzilla

+0

무엇을 기대합니까? 테이블에 레코드가 없으면 모든 카테고리를 나열하는 다른 테이블이없는 한 표시 할 항목이 없습니다. – McGarnagle

+0

@dbaseman 그건 내가 두려워했던거야. 것은 "범주"가 데이터베이스에 없다는 것입니다. 특정 조건이 존재할 때 쿼리에 정의됩니다. 그렇지 않으면 그 레코드를 얻기 위해 외부 조인을 할 것입니다. 그것이이 문제에 대한 유일한 대안입니까? 감사합니다 – aleafonso

답변

3

에 대한 새로운 category 테이블에 대해 외래 키를 사용하여 수정할 수있는 것은 테이블 : 당신은 당신이 그룹화되지 않은 무언가를 선택하지 않아야하기 때문에

select surrogateTable.name, 
     surrogateTable.Category, 
     count(id) as totalCalls 
from 
(
    select 'whatever1' Name, 
     'First Category' Category 
    union all 
    select 'whatever2', 
     'Second Category' 
) surrogateTable 
left join missed_call 
    on surrogateTable.Name = missed_call.Name 
group by surrogateTable.name, surrogateTable.category 

내가 선택에 ID를 감소 - 이것은 아마도 MySQL을합니다.

Check this on Sql Fiddle.

1

문제는 부재중 전화 만보고 범주가 아니라는 점입니다. 따라서 부재중 전화가없는 범주는 알 수 없습니다.

여기에 카테고리 테이블의 실제 구조에 맞게 조정한다고 가정하는 해골이 있습니다.

SELECT ... 
FROM Category cat 
    LEFT JOIN missed_call call ON call.category = category.id 
WHERE (call.name = 'whatever1' OR call.category IS NULL) 
GROUP BY call.name, call.category 
... 

참고 특히 call.category IS NULL. 이 열은 null로 지정할 수 없습니다. 그래서 이것은 실제로 외부 호출의 결과물 인 해당 호출없이 Category 행을 검사합니다.

+1

이것은 갈 길입니다.카테고리 테이블이 없다면, 임시 테이블 또는 임시 테이블 중 하나를 생성하십시오. (SELECT 'whatever1'AS 이름 UNION SELECT 'whatever2') AS 고양이 ' –

+0

네, 그래도 작동 하겠지만 카테고리 이름은 다음과 같이 하드 코딩됩니다. 유지 관리의 관점에서 보면 이상적인 것은 아닙니다. – Brad

0

category이라는 테이블을 정의 할 수 있습니다. 가능한 모든 카테고리 이름의 전체 목록을 포함해야합니다. 즉, 할당 된 통화가없는 경우 (예 : 0)도 가능합니다.

create table category 
(
    id numeric(10,0) NOT NULL, 
    name varchar(10) NULL 
) 

그럼 당신은이 테이블에서 범주의 전체 목록을 조회 할 수 있으며, 왼쪽은 위에서 무슨에 대한 결과를 가입.

그런 다음 당신은 당신이 항상 척 수있는 데이터베이스 스키마를 확장 할 꺼리는 경우 missed_call 더 나은 효율성과 더 나은 스키마 설계

create table missed_call 
(
    id numeric(10,0) NOT NULL, 
    first_category_id numeric(10,0) NULL, 
    second_category_id numeric(10,0) NULL, 
    name varchar(12) 
)