【问题标题】:MySQL: Get data from multiple tables allowing nulls with a list of idsMySQL:从多个表中获取数据,允许带有 ID 列表的空值
【发布时间】:2019-03-14 12:49:43
【问题描述】:

我得到的表格如下所示:

表 1

|id|value1|value2|value3

表 2

|id|value4|value5|value6

每个表中的 id 值是唯一的,但 id 可以出现在表 1 中但不会出现在表 2 中。(值 1 等于 value4 但如果 id 不出现在表 2 中 value4 将为空...)

然后我得到了这个 id,我想得到某个时间(假设 id 出现在表 1 中但没有出现在表 2 中,反之亦然):


resultgrid
| id | value1| value2| value3|value4|value5|value6

|838383|result1|result2|result3|null  |null  |null
|548438|null   |null   |null   |result4|result5|result6

希望大家能帮帮我,谢谢!

编辑:我一直在尝试的查询(它实际上是我在堆栈溢出中看到的一组收集的答案)

SELECT t1.*, t2.value4, t2.value5, t2.value6
FROM table1 as t1
JOIN table2 AS t2 ON t2.id = t1.id
Where t1.id = t2.id = 838383

这让我返回了 0 行。

我想让

【问题讨论】:

  • 请显示您的查询。如果您不与我们分享,我们无法修复它。并添加您当前正在获取的数据。
  • 如果两个表中都有匹配的 id 行怎么办。它们会被显示吗?
  • @DawidFerenczy 当然,我确实尝试了多个查询,我使用最后一次尝试进行了编辑。

标签: mysql sql database join mysql-workbench


【解决方案1】:
  • 您可以使用两个不同的Select 查询,在两个表之间使用Left join。在第一个查询中,将table1 视为最左边的表; table2 在第二个查询中位于最左侧。
  • 使用Where <right table id> IS NULL 过滤掉最右侧表中没有匹配条目的行。
  • 使用Union 组合结果集。由于不会有任何重复(由于我们的查询结果),我们可以使用Union All

尝试以下方法:

SELECT t1.id, t1.value1, t1.value2, t1.value3, 
              t2.value4, t2.value5, t2.value6 
FROM table1 AS t1 
LEFT JOIN table2 AS t2 ON t2.id = t1.id 
WHERE t2.id IS NULL 

UNION ALL 

SELECT t2.id, t1.value1, t1.value2, t1.value3, 
              t2.value4, t2.value5, t2.value6 
FROM table2 AS t2 
LEFT JOIN table1 AS t1 ON t1.id = t2.id 
WHERE t1.id IS NULL 

【讨论】:

  • 我怀疑这会给 topicstarters 提供他所追求的正确结果.. 看起来他正在寻找一个透视查询来将交叉表记录转换为列。 10 次中有 9 次是使用 MAX(CASE END)GROUP BY 组合完成的,此外看起来这个查询需要用作子查询才能进行旋转。但如果没有示例数据,很难确定..
  • @RaymondNijland 样本数据不够。基于对 OP 单词的有限理解和给定的数据集 - 当前查询似乎满足该要求
  • @MadhurBhaiya 这给了我一个结果网格,就像我发布的示例一样,但缺少将其概括为 id 列表的部分,我知道这是不可能的(据我对 Mysql 的理解),但我可以使用包含 10 个 ID 的列表。
  • @S.Teves 您可以使用 where 条件。您能否编辑您的问题以添加您需要的具体案例。
  • @S.Teves 在第一个选择查询中添加and t1.id < 2000,在第二个选择查询中添加and t2.id < 2000(据我所知,您需要获取所有 id
【解决方案2】:

你想要一个 MySQL 不支持的full outer join。在您的情况下,您可以使用left join 来模拟:

select t1.*, t2.value4, t2.value5, t2.value6
from (select 838383 as id
     ) i left join
     table1 t1
     on t1.id = i.id left join
     table2 t2 
     on t2.id = i.id;

您要保留的 id 列表位于 i 子查询中。

【讨论】:

  • 这个帮助我解决了我的问题,但我最终制作了一个 python 脚本来通过列表播放电影。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
相关资源
最近更新 更多