2012-01-21 73 views
2

如何僅通過一個mysql查詢就可以加入這個多個查詢?通過單個查詢加入嵌套/多個查詢

$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

如果你想爲你在你的例子中,你可以做的就是完全相同的結果:

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行,並且僅當區查詢返回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爲空,但是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 
) 

如果結果集包含至少一排,其中城市不爲空,一個地方區不爲空,一個地方街道不爲空,那麼你已經得到了有效的結果集。

+0

+1這與我試圖圍繞我的頭相似。 – Josh

+0

這將仍然返回城市行和地區行,如果他們都匹配,原來不會。 –

+0

@JoachimIsaksson更新了我的答案。 – GordonM