2012-03-20 3 views
0

Возможно ли сделать соединение в 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.status, если строка в date_status существует, но default_weekday_status.status иначе.

(Обратите внимание, что 20.03.2012 является вторник и нет, tuesday не будет храниться в виде строки ;-))

ответ

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

+0

не будет работать с нормальным присоединиться хотя. – Konerak

+0

Я получил меня там ... исправлено :) – fie

+0

Лучше, но почему левые присоединяются? Я думал правильно. – Konerak

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 

PS: а RIGHT OUTER JOIN просто LEFT JOIN с таблицами в обратный порядок ...