2014-02-12 1 views
0

사용자 조건에 따라 데이터가 존재하지 않으면 MySQL에서 새로운 가상 행을 만들 수 있습니까?
내 쿼리는 다음과 같습니다SQL : 명령 존재하지 않는 경우 가상 행 만들기

SELECT year, value, type FROM myTable 
WHERE year BETWEEN ('2010' AND '2013') AND type IN ('Oil', 'Gas'); 

출력 :

year | value | type 
    --------------------- 
    2013 | 0 | Oil 
    2012 | 144.5 | Oil 
    2012 | 434.3 | Gas 
    2011 | 141.0 | Oil 
    2011 | 1234 | Gas 
    2010 | 4567 | Gas 
    --------------------- 

이 같은 출력을 기록하는 쿼리를 실행하려면 :

year | value | type 
    --------------------- 
    2013 | 0 | Oil 
    2013 | 0 | Gas // -> new virtual* row 
    2012 | 144.5 | Oil 
    2012 | 434.3 | Gas 
    2011 | 141.0 | Oil 
    2011 | 1234 | Gas 
    2010 | 4567 | Gas 
    2010 | 0  | Oil // -> new virtual* row 
    --------------------- 

사용자가 모두 표시 할을 'Gas'와 'Oil'이 있지만 2013 년 이후에는 'Oil'유형 만 포함되어 있으므로 0 값으로 'Gas'에 대한 새 레코드를 만들고 싶습니다. '2010'과 동일합니다 (원하는 출력 위).

편집 :

CREATE TABLE `myTable` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `type` varchar(15) DEFAULT NULL, 
    `year` year(4) DEFAULT NULL, 
    `value` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=92278 DEFAULT CHARSET=latin1 
+0

은 쉽게 클라이언트 측 (PHP)에이보기를 제공 할 수 있습니다 선호하는, 사실상 쿼리 동안 해당 행을 추가하는 것입니다 왜 이런 종류의 쿼리를 검색하고 있습니까? –

+0

유형으로 석유와 가스 만 있습니까? – Mihai

+0

'type'도 동적이며 '석탄', '전원'등과 같이 사용자 입력에 따라 다를 수 있습니다. (실제로, 나는 두 개의 테이블을 가지고 있는데, 하나는 값을위한 것이고 다른 하나는 typeNames를위한 것이다.) – 1mr3yn

답변

1

당신에게 언급 한 바와 같이 실제로 2 개 테이블을 가지고있다.

나는 0 값으로 데이터베이스를 오염시키지 않는 것이 좋습니다.

INSERT INTO data 
SELECT 
    cross_join.year as year, 
    0 as value, 
    cross_join.id as type_id 
FROM data 
RIGHT JOIN (
    SELECT types.id, year 
    FROM types 
    JOIN (SELECT DISTINCT year FROM data) distinct_years 
) cross_join ON (cross_join.id = data.type_id AND cross_join.year = data.year) 
WHERE data.year IS NULL 

또 다른 방법은, 내가

SELECT 
    COALESCE(data.year, cross_join.year) as year, 
    COALESCE(data.value, 0) as value, 
    COALESCE(data.type_id, cross_join.id) as type_id 
FROM data 
RIGHT JOIN (
    SELECT types.id, year 
    FROM types 
    JOIN (SELECT DISTINCT year FROM data) distinct_years 
) cross_join ON (cross_join.id = data.type_id AND cross_join.year = data.year); 

Demo can be found here.

+0

gracias! 두 번째 쿼리는 내가 찾는 쿼리입니다. 미안하지만 (내 질문에) 분명히하지 않으면 가상 행도 선호합니다. 건배! – 1mr3yn

관련 문제