【问题标题】:JOIN and the ON clause (NULL values)JOIN 和 ON 子句(NULL 值)
【发布时间】:2013-04-04 13:00:57
【问题描述】:

我有两张桌子

tableA (id,randomNumber) (2,1),(3,5),(3,2),(6,0),(8,0),...
tableB (id,randomNumber2) (0,2),(1,3),(2,0),(4,2)...

现在我想从两个表中获取 id、randomnumber 和 randomnumber2 where ID IN (0,1,2,3)。

所以应该返回:

(2,1), (3,5), (3,2), (0,2), (1,3), (2,0) 

我尝试了使用 JOIN 和 LEFT JOIN 的结构。

问题是当 ON 子句 (JOIN tableB b on a.id=b.id) 不为真时,它为 id 返回 NULL。但我还需要知道 NULL 值。例如对于 tableB,它会为第一个结果返回 (NULL,2)。

(2,1), (3,5), (3,2), (NULL,2), (NULL,3), (2,0) 

我怎样才能获得 NULL 值,我应该使用其他东西吗?

【问题讨论】:

    标签: php mysql join


    【解决方案1】:

    JOINs 用于表有相关数据时。在这里,两张桌子彼此无关。更好的选择是使用UNION

    SELECT id, randomNumber
    FROM tableA
    WHERE ID IN (0,1,2,3)
    
    UNION ALL
    
    SELECT id, randomNumber2
    FROM tableB
    WHERE ID IN (0,1,2,3)
    

    或者,只需使用 2 个单独的查询并组合结果。

    【讨论】:

      【解决方案2】:

      您可以将UNION 与子查询一起使用:

      SELECT id, rn
      FROM (
          SELECT Id, randomNumber rn
          FROM tableA
          UNION
          SELECT Id, randomNumber2
          FROM tableB
      ) t
      WHERE id IN (0,1,2,3)
      

      如果您想要重复值,您可能需要使用UNION ALL

      【讨论】:

      • 这还会返回 randomNumber2 还是只返回 id 和 rn (randomNumber) ?
      • @Nicolas -- 是的,这将返回带有相应 ID 的 randomNumber 和 randomNumber2 - 当然是 ID IN (0,1,2,3)。
      • 我建议不要在这里使用子查询。它不会使用表上的索引。
      • @RocketHazmat -- 我完全同意,但有些东西告诉我该表结构,索引可能不存在 :) 我赞成你的答案!
      • @sgeddes:是的。我不知道他的表结构。我也会给你一个赞成票:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 2021-09-29
      • 1970-01-01
      • 2010-11-04
      • 2010-12-04
      • 1970-01-01
      相关资源
      最近更新 更多