2012-01-21 2 views
2

단일 다중 쿼리로이 다중 쿼리에 어떻게 참여할 수 있습니까?단일 쿼리로 중첩/다중 쿼리에 가입

$query = $mysql->query("select rate from postages where city=$city"); 

if($query->num_rows == 0) 
{ 
    $query = $mysql->query("select rate from postages where subdistrict=$subdistrict"); 

    if($query->num_rows == 0) 
    { 
     $query = $mysql->query("select rate from postages where district=$district");   
    } 
} 

도움 주셔서 감사합니다.

+0

위 쿼리 조건을 따른다고 가정합니까? 도시에 사용할 수있는 요금이 없다면, 구청 등의 요금을 받으시겠습니까? – Josh

+0

@Josh : 예, 그런 식으로. –

+0

각 쿼리는 하나의 행만 반환 할 것으로 기대합니까? 예를 들어 같은 도시와 다른 하위 계급이있는 여러 행이 있습니까? –

답변

2

도시 쿼리는 0 행을 반환하고 지구 쿼리가 0 행을 반환하는 경우에만 하위 명령 호출을 실행합니다.

SELECT IFNULL(
     (SELECT rate FROM postages where city = '$city'), 
    IFNULL(
     (SELECT rate FROM postages where district = '$district' limit 1), 
     (SELECT rate FROM postages where subdistrict = '$subdistrict' limit 1) 
    ) 
) as rate 
+1

도시가 일치하지 않으면 첫 번째는 항상 0을 반환합니다 (도시 쿼리는 개별적으로 c.rate를 null로 반환하지만 nullif는 c.rate를 0으로 간주 함). 두 번째 충돌은 같은 지역과 도시가 일치하지 않습니다 (하위 쿼리가 두 개 이상의 행을 반환합니다). –

+1

질문에 대한 의견은 원래 두 번째 버전을 매우 정확하게 만드는 쿼리 당 하나의 일치가 있음을 확인합니다. –

+1

이것은 흥미로운 일입니다 질문에는 여러 가지 방법이 있으므로 –

3

쿼리를 함께 결합 할 수 있지만 결과가 도시, 지구 또는 정 지구인지 알 수있는 결과가 필요합니다. 내가 분명히 테스트하지는 못했지만 다음과 같은 것이 효과가있을 수도있다.

(
    SELECT 
     city AS city, 
     NULL AS district, 
     NULL AS subdistrict, 
     rate AS rate 
    FROM postages 
    WHERE city=$city 
) UNION (
    SELECT 
     NULL, 
     district, 
     NULL, 
     rate 
    FROM postages 
    WHERE city=$city 
    AND district=$district 
) UNION (
    SELECT 
     NULL, 
     NULL, 
     subdistrict, 
     rate 
    FROM postages 
    WHERE city=$city 
    AND district=$district 
    AND subdistrict=$subdistrict 
) 

결과 집합 도시가 null가 아닌 행이 하나 이상 포함되어있는 경우

지구가 null이 아닌 하나 가도가 null가 아닌 사람은 당신은 유효한 결과 세트를 입수했습니다.

SELECT IFNULL(c.rate, IFNULL(d.rate, s.rate)) as rate FROM (
    (SELECT rate, count(*) FROM postages where city = '$city') as c, 
    (SELECT rate, count(*) FROM postages where district = '$district') as d, 
    (SELECT rate, count(*) FROM postages where subdistrict = '$subdistrict') as s 
) 

당신은 그것을 다른 방법 ... 단지 지구 쿼리를 실행 할도 수입니다 경우 : 당신은 당신이 할 수있는 귀하의 예제에서이 같이 동일한 결과를 얻을 수 원한다면

+0

+1 내 머리를 감싸고있는 것과 비슷합니다. – Josh

+0

원본과 다를 경우 도시 행과 지구 행 모두를 반환합니다. –

+0

@JoachimIsaksson 내 대답이 업데이트되었습니다. – GordonM

관련 문제