我有几个表,其中一个包含源数据,我将其称为 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
但是不会包含未被覆盖的源行(它的作用类似于内部联接)(例如源 id 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
这可能会返回比我需要的更多的数据(例如覆盖相同源数据的其他用户),然后我必须以编程方式进行过滤。
看来我应该能够制作一个查询来完成所有数据库级别的操作并提供我所需要的内容。有什么帮助吗?
最佳答案
你应该在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
关于MySQL 左连接使用默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37912914/