mysql以优先级连接

时间:2012-03-20 11:05:59

标签: mysql

是否可以在mysql中进行连接,以便当且仅当左表中的相应值不存在时才返回右表中的值?

例如

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

如果date_status中的行存在,我希望这返回date_status.status,否则返回default_weekday_status.status

(请注意,20-03-2012是星期二,不,tuesday不会存储为字符串;-))

2 个答案:

答案 0 :(得分:3)

使用RIGHT OUTER JOIN从右表中选择所有值,即使左表没有值。

现在使用COALESCE获取ds.value,当值为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

P.S。:一个正确的外部联接只是一个LEFT JOIN,表格按逆序排列......

答案 1 :(得分:3)

最简单的方法是使用COALESCE功能。我将在参数列表中返回第一个非空值。

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