【问题标题】:Complicated (my)SQL left join复杂的(我的)SQL左连接
【发布时间】:2014-11-05 03:06:25
【问题描述】:

是否有可能有一个左连接,它会给出如下假设中的结果:

表 A:

id   value
1    foo
2    bar
3    foobar

表 B:

foreign   foreign_value
1         fish
1         soup

连接的结果应该是表 A 的每个结果(左连接)以及 A 和 B 之间的连接结果:

SELECT * FROM A complex join B ON A.id=B.foreign:

id   value    foreign   foreign_value
1    foo      NULL      NULL
1    foo      1         fish
1    foo      1         soup
2    bar      NULL      NULL
3    foobar   NULL      NULL

当执行一个普通的 LEFT JOIN 时,显示的示例结果集的第一行将不存在。

这样的选择可能吗?

【问题讨论】:

  • 你的意思是outer join
  • 我不确定你想要达到什么目的。这根本不是一个连接,因为它包含来自其他地方的不存在的值。 (例如,在 id=1 的情况下,外国/值的 null-null)。了解更多信息会有所帮助。
  • 整个故事可能是由于添加了附加功能而导致的糟糕的数据库/表设计。在 CMS 中,我们显示分配给某个页面的“新闻”记录(简单的 int 字段“pid”)。新功能允许新闻显示在多个页面上。为此,我添加了一个包含新闻页面关系的 M-M 表。现在我必须将旧的“pid”类型查询与新的 MM 查询结合起来,整个事情都归结为这个问题。
  • 如果我想计算一个页面上的新闻数量,我将不得不计算那些真正驻留在页面上的新闻 + 以及那些从 MM 表中引用的新闻
  • 我通过执行两个单独的查询从 PHP 中解决了这个问题。我只是好奇是否有可能在单个查询中 - 类似于上述示例的连接必须存在。不过还是谢谢。

标签: mysql join null left-join


【解决方案1】:

不,这样的连接是不可能的,因为你不会得到第一行。

你可以使用类似的联合

SELECT a.id, a.value, b.foreign, b.foreign_value 
FROM A inner join B ON A.id=B.foreign
    UNION
SELECT a.id, a.value, null, null
FROM A

这将在您的示例中给出预期结果,但我不明白您为什么尝试这样做。因此,我不知道这是否在一般情况下给出了预期的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多