2012-01-21 1 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

@ジョシュ:そうですね。 –

+0

各クエリは1つの行のみを返すと予想されますか?たとえば、同じ都市と異なるサブディストリビューションを持つ複数の行がありますか? –

答えて

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

コメントはこれが面白いの一種である2番目のバージョンはかなり正しい:) –

+1

を行い、元の問合せごとに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ではない少なくとも1つの行、地区がnullでなく、subdistrictがnullではありません、あなたは、有効な結果セットを得ている1 1が含まれている場合。

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

関連する問題