2016-06-19 3 views
0

У меня есть пара таблиц, одна с исходными данными, которую я назову SourceData, и другой, который определяет переопределенные значения для данного пользователя, если они существуют, называется OverriddenSourceData.MySQL left join со значениями по умолчанию

Основной формат таблицы выглядит это как:

SourceData 
| source_id | payload   | 
-------------------------------- 
| 1   | 'some json'  | 
| 2   | 'some more json' | 
-------------------------------- 


OverriddenSourceData 
| id | source_id | user_id | overrides 
| 1 | 2  | 4  | 'a change'  | 
------------------------------------------ 

Для данного пользователя, я хотел бы вернуть все строки Источник данных с overrides колонка включена. Если пользователь переопределил источник, тогда заполняется столбец, иначе он равен нулю.

Я начал с выполнения соединения слева, а затем в том числе условия для проверки пользователя, как так:

SELECT A.source_id, A.payload, B.overrides from SourceData A 
LEFT JOIN OverriddenSourceData B 
ON A.source_id = B.source_id 
WHERE user_id = 4 

но исходные строки, которые не были переопределены, не будут включены (он вел себя как внутреннее соединение) (например, идентификатор источника 1)

Затем я расслабил запрос и использовал строчное левое соединение на source_id.

SELECT A.source_id, A.payload, B.overrides from SourceData A 
LEFT JOIN OverriddenSourceData B 
ON A.source_id = B.source_id 
# WHERE user_id = 4 

Это может возвращать больше данных, чем мне нужно, хотя (например другие пользователи, которые переопределены те же исходные данные), а затем я должен фильтровать программно.

Кажется, что я должен обработать запрос, который делает все это на уровне БД и дает мне то, что мне нужно. Любая помощь?

+1

Изменить ГДЕ И – Strawberry

ответ

1

Вы должны добавить условие на LEFT JOIN пункта, если вы используете WHERE, MySQL будет делать это с INNER JOIN, поэтому попробуйте это;)

SELECT A.source_id, A.payload, B.overrides from SourceData A 
LEFT JOIN OverriddenSourceData B 
ON A.source_id = B.source_id 
AND B.user_id = 4 
+0

работал как шарм. Очень признателен! – ssirowy