我有几个表,一个包含源数据,我将调用SourceData
,另一个表定义了给定用户的被覆盖值(如果它们存在,则称为OverriddenSourceData
。
基本表格格式如下:
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
这可以返回比我需要的更多的数据(例如,其他用户已经覆盖相同的源数据),然后我必须以编程方式进行过滤。
似乎我应该能够创建一个执行所有数据库级别的查询并提供我需要的内容。有什么帮助吗?
答案 0 :(得分: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