2010-11-30 3 views
1

안녕하세요 테이블에서 레코드를 실행하는 견해를 만들기 위해 노력하고 있습니다 및 견인 년 사이에 잘 ​​작동하지만 모든 값을 나열해야합니다. 검색 사이에mysql 쿼리 검색 레코드를 BETWEEN 및 종료 여부를 입력하십시오.

쿼리

select SUM(price) FROM orders where year BETWEEN 2004 and 2009 GROUP BY year 
2005 | 200 
2006 | 100 
2008 | 400 

i am trying to show like this 

2005 | 200 
2006 | 100 
2007 | 0 
2008 | 400 
2009 | 0 
-- ---------------------------- 
-- Table structure for `orders` 
-- ---------------------------- 
DROP TABLE IF EXISTS `orders`; 
CREATE TABLE `orders` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `price` decimal(10,0) DEFAULT NULL, 
    `year` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Records of orders 
-- ---------------------------- 
INSERT INTO orders VALUES ('1', '200', '2005'); 
INSERT INTO orders VALUES ('2', '100', '2006'); 
INSERT INTO orders VALUES ('3', '400', '2008'); 

또는 내가 모든 년의 목록이 필요합니다, 일부 루프 또는 뭔가를해야만 제안에게 도움

답변

2

외부에서 조인 할 수있는 보조 테이블이 필요합니다. 영구적 인 테이블이없는 경우에는 파생 테이블을 사용할 수 있습니다.

SELECT coalesce(SUM(o.price),0) AS price 
FROM  (SELECT 2004 AS yr 
     UNION ALL 
     SELECT 2005 
     UNION ALL 
     SELECT 2006 
     UNION ALL 
     SELECT 2007 
     UNION ALL 
     SELECT 2008 
     UNION ALL 
     SELECT 2009 
     ) 
     y 
     LEFT JOIN orders o 
     ON  y.yr = o.year 
GROUP BY y.yr 
+0

'AS yr'은 첫 번째'SELECT 2004 AS yr'에 있어야합니까? 나는 항상 거기에 넣었다. – Danosaure

+0

@Danosaure - 예. 잘 잡으세요! –

+0

그리고 저는 join에서'USING (year)'을 사용하기 위해'year'라고 이름을 짓기로합니다. 나는 그것이 더 효율적인지 아닌지 잘 모르겠지만, 나는 게으르다. – Danosaure

1

내가 당신을 이해하는 경우에 대한 감사와 PHP는이 작업을 수행해야합니까, 여부 주문이 들어 있지 않은지

이 작업을 수행하는 데는 몇 가지 방법이 있지만 인스턴스 연도라는 다른 테이블을 만들고 필요한 값으로 채우는 것이 좋습니다.

이 테이블에 가입하면 표현 된 모든 연도와 다른 테이블의 합계를 얻을 수 있습니다.

관련 문제