2012-03-20 17 views
0

mysqlで結合を行って、左側のテーブルの対応する値が存在しない場合にのみ、右側のテーブルの値を返すことはできますか?mysql join with precedence

SELECT * FROM 
    (SELECT userid,status FROM date_status WHERE date='20-03-2012') ds 
JOIN 
    (SELECT userid,status FROM default_weekday_status WHERE day='tuesday') dws 
ON 
    ds.userid=dws.userid 

例えば

Iはdate_statusの行が存在する場合、これはdate_status.statusを返すように好きですが、それ以外の場合default_weekday_status.statusなります。

(20-03-2012は火曜日であるとなし、tuesdayが文字列;-)として格納されないことに注意してください)

答えて

3

これを行う最も簡単な方法は、COALESCE機能です。私はパラメータのリストで最初の非null値を返します。

SELECT coalesce(ds.status,dws.status) as status FROM 
    date_status ds 
RIGHT JOIN 
    default_weekday_status dws 
ON 
    ds.userid=dws.userid 
WHERE 
    ds.date='20-03-2012' or dws.day='tuesday' 

サブクエリはあまり効率的ではないため、削除されました。

MySQL - COALESCE

+0

通常の結合では機能しません。 – Konerak

+0

ええ、そこには...固定:) – fie

+0

もっといいですが、なぜ左に参加するのですか?私は正しいと思っていた。 – Konerak

3

場合でも、右テーブルからすべての値を選択するにはRIGHT OUTER JOINを使用して、左の表の値はありません。

今ds.valueを取得するためにCOALESCEを使用して、値がNULLの場合、dws.valueを得る:

SELECT COALESCE(ds.value,dws.value) FROM 
    (SELECT userid,status FROM date_status WHERE date='20-03-2012') ds 
RIGHT OUTER JOIN 
    (SELECT userid,status FROM default_weekday_status WHERE day='tuesday') dws 
ON 
    ds.userid=dws.userid 

PS:RIGHT OUTER JOINをLEFTだけであるが中にテーブルを登録しよう逆順...