2015-10-29 2 views
0

У меня есть 3 таблицы, в которых хранятся пользователь, доступные настройки и пользовательские настройки. таблица Пользователь имеет стандартные вещи пользователя, как имя пользователя, пароль, имя, дату и т.д. таблица настроек содержит список всех доступных параметров системы и значения по умолчанию, как:Объединение 3 таблиц MySQL в 1 запрос

settingID name     defaultValue 
---------------------------------------------- 
1   push notifications 1 
2   profile image   0 
3   full name    1 
4   distance measure  Miles 

настройки пользователя таблица содержит пользовательские настройки, установленные пользователь так:

userSettingID userID settingID customValue 
---------------------------------------------------------- 
1    1   1   0 
2    1   3   0 
3    1   4   KM 

Я пытаюсь сделать запрос, который будет присоединиться все 3 таблицы вместе, однако производят все результаты из таблицы параметров, и если есть совпадение в таблице UserSettings использовать customValue в противном случае используйте defaultValue из таблицы настроек.

Так что я хотел бы производить ниже:

userID settingID userSettingID name  defaultValue customValue 
--------------------------------------------------------------------------- 
1  1   1    push... 1    0 
null  2   null   profi.. 0    null 
1  3   2    full... 1    0 
1  4   3    dista.. Miles   KM 

Как вы можете видеть, что я хотел бы установить все параметры записи, и если результаты заполнения с идентификатором пользователя и/или customValue иначе заправить NULL.

Мне удалось получить желаемые результаты, но как только я добавляю предложение WHERE userID = x, я получаю только записи, на которые был установлен пользователь.

Благодаря

Edit: запрос я до сих пор является:

SELECT * 
FROM settings 
LEFT OUTER JOIN userSettings ON settings.settingID = userSettings.settingID 
LEFT OUTER JOIN user ON userSettings.userID = user.userID 
+0

Измените свой вопрос и включите запрос, который вы написали. –

ответ

1

Чтобы получить customValue вместо defaultValue, если он присутствует Вы можете использовать функцию coalesce и для фильтрации userid вы 'Я хочу добавить условие к соединению вместо того, чтобы использовать его в предложении where (что сделало бы левое соединение таким же, как внутреннее соединение).

Я предполагаю, что Вы хотите что-то вроде этого:

select 
    us.userID, 
    s.settingID, 
    us.userSettingID, 
    s.name, 
    s.defaultValue, 
    us.customValue, 
    coalesce(us.customValue, s.defaultvalue) as OverriddenValue 
from settings s 
left join Usersetting us on s.settingID = us.settingID 
left join user u on u.userid = us.userID and u.userID = 1 

user не является зарезервированным ключевым словом в MySQL и как таковой не является хорошим выбором для идентификатора, хотя разрешается использовать без цитирования.

+0

Спасибо за это. Кажется, что он работает нормально, однако, если есть другой пользователь (например, пользователь 2), у которого есть параметр, который пользователь 1 не делает, пользователь 1 наследует пользовательские настройки пользователя 2 вместо использования по умолчанию. – puks1978

+0

@ puks1978 О, верно. Я неправильно понял. Попробуйте это: 'select *, coalesce (us.customValue, c.defaultvalue) from (выберите * у пользователей, настройки) c left join Usersetting us on us.settingID = c.settingID и us.userID = c.userid где c.userid = 1' – jpw

+0

PERFECT! Спасибо. – puks1978

Смежные вопросы