MySQL 左连接使用默认值

标签 mysql database join

我有几个表,其中一个包含源数据,我将其称为 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/

相关文章:

php - 如何在Mysql中实现Join来获取以下记录

mysql - mysql中如何将两个大表合并为一个

Grails 与静态映射表的关系

mysql - 如何在不进行拆卸/重建的情况下更新生产系统时更新数据库结构

mysql - 将 MySQL 查询结果以 CSV 文件导出到我的 PC

database - Zend_Db_Table : What happens when insert results in an error?

c# - ServiceStack: View 中未使用自定义应用程序设置

MySQL ORDER BY + LIMIT + OFFSET 语句 : how to OFFSET firts and only then sort with ORDER BY

mysql - 在php中调用mysql存储过程

mysql - 用两个数据(外键)填充数据库字段