2013-02-15 2 views
1

나는이 구성을 저장하는 것입니다 조건부로 mysql에서 두 행을 선택 하시겠습니까?

id | package | env  | key  | value 
int | varchar | varchar | varchar | varchar 

처럼 ENV가 null

하지만 같은 행이 자동 증가로 다시 (다른 ID를 표시 수있는 곳, 그래서 행이 데이터베이스에 존재하게 보이는 테이블이) 여러 번, 다른 env 값. 내가 원하는 무엇

는 모든 행 where package = 'something'env is null 얻을 수 있지만 행이 같은 packagekeyenv = 'something_else에있는 경우 다음 내가 대신 행 env is null의 해당 행을 반환합니다. 그래서

, 주어진이 데이터

1 | something | null  | title | a default title 
2 | something | testing  | title | a testing title 
3 | something | development | title | a development title 
4 | something | null  | byline | a default byline 
5 | another | null  | title | another default title 
6 | another | testing  | title | another testing title 

나는 두 개의 쿼리를 실행할 수 난 다시 원하는 행이

2 | something | testing  | title | a testing title 
4 | something | null  | byline | a default byline 

입니다 패키지 something과 ENV testing 사용하는 경우, 하나를 얻을 모든 행 package = something 그리고 env is null 그리고 또 다른 쿼리가 package = somethingenv = testing 인 다음 두 번째 결과를 첫 번째 병합합니다. 그러나 하나의 쿼리로이 작업을 수행하는 방법이 있습니까?

+1

왜'testing'이 아닌'development' 또는 둘 다입니까? 그리고 왜 아직도'null' 결과가 나오나요? –

+0

그들은 다른 환경이며,'null' = 디폴트 값,'testing' = 우리가 테스트 환경에있을 때의 설정 오버라이드,'deveopment' = 우리가 개발 환경에있을 때를위한 설정 오버라이드, 그래서. 우리는 항상 기본 설정을 원하고 현재 환경에 대한 재정의가 존재하면 기본 설정 행 (일명 env가 null 임) 대신에 그 값을 원합니다. – Hailwood

+0

say igniter 또는 laravel config의 컨텍스트에서 생각해보십시오. config 배열을 포함하는 기본 config.php를 가지고 있다면 환경에 있다면 우리가 넘기고 싶은 모든 키를 가진 자신 만의 config.php가있는 환경에 맞는 다른 폴더를 갖게 될 것입니다. – Hailwood

답변

2

당신이 같은 것을 사용할 수 있습니다

SELECT packages.* 
FROM packages 
WHERE 
    id IN (
    SELECT coalesce(min(case when env is not null then id end), min(id)) 
    FROM  packages 
    WHERE (env = 'development' or env is null) 
    GROUP BY package, `key`) 

이 바이올린 here를 참조하십시오.

서브 쿼리에서 package, key에 대해 env이 null이 아닌 최소 ID가 반환됩니다. env가 null이 아닌 행이 없으면 COALESCE를 사용하여 최소 ID를 반환합니다.

+0

그래서 '특정 환경이'is not null' 대신 = 'what'이 작동해야한다면? – Hailwood

+0

@Hailwood 제 답변을 업데이트했습니다. 하위 쿼리에서 조건을 지정해야합니다. 다음과 같이 작성할 수도 있습니다 :'WHERE package = 'something'이고 (env = 'development'또는 env가 null입니다.)' – fthiella

0

당신이 시도 할 수 :

SELECT * 
FROM `table` 
WHERE `package` = 'something' 
    AND (`env` = 'testing' 
     OR `env` IS NULL) 
GROUP BY `key` 
ORDER BY id ASC 
+0

항상 기본값을 반환합니다. – Hailwood

+0

그러나'ORDER BY' 절은 그것을 처리해야합니까? – hjpotter92

+0

또한 기본값은 이론적으로 처음이어야하지만 보장 할 수는 없습니다. – Hailwood

관련 문제