【问题标题】:Subquery driving NULL values into outer query子查询将 NULL 值驱动到外部查询中
【发布时间】:2019-10-24 12:14:33
【问题描述】:

我在嵌套查询中不断得到 NULL 行

如果我们有以下表格:

  1. 包含文章信息的“文章”

  2. 'bom' 包含文章 ID 之间的 m-n 关系,形成物料清单

并非每篇文章都出现在“bom”表中 - 有些文章既不会作为父节点出现,也不会作为任何物料清单中的子节点出现。

我正在尝试获取文章列表并包含一个包含材料清单的串联字符串,以防我的文章是父节点。

因此我在 MySQL 中尝试这种查询结构:

SELECT
a.id,
a.name,
(SELECT group_concat(
   bom.quantity, ' times ',
   a_child.partnumber, ' ',
   a_child.name)
   FROM
      bom
      left outer join article a_child on a_child.id = bom.child_article
   WHERE
      bom.parent_article = a.id
) myBOM
from article a

查询还应该返回不是任何 bom 的父项或任何 bom 的一部分的普通文章。

如果父文章确实有关联的 bom,则应在 myBOM 列上对其进行概述。否则该列应该是空的。

我现在在外部查询中得到一些返回 NULL 的行,而其他行运行良好 - 我不知道是什么驱动了一些行,而另一些行则失败了。

我该怎么办?

更新:一些示例数据:

article

id   | name    | partnumber
-----+---------+------------
1    | desk    | P001
2    | leg     | P002
3    | board   | P003

bom

id   | parent_article | child_article | quantity
-----+----------------+---------------+---------
1    | 1              | 2             | 4
2    | 1              | 3             | 1

预期输出:

id   | name       | myBOM
-----+------------+-------------------------------------
1    | table      | 4 times P002 leg, 1 times P003 board
2    | leg        |
3    | board      |

【问题讨论】:

  • 请提供一些样本数据和想要的结果。
  • @PM77-1 我刚刚用一些示例数据更新了这个问题。问题是:它有时有效,有时无效。我不知道可能出了什么问题。

标签: mysql


【解决方案1】:

我猜应该交换表并使用 IFNULL 指令进行 group_concut 换行...以下查询返回所需的结果

SELECT
a.id,
a.name,
(SELECT IFNULL(group_concat(
   bom.quantity, ' times ',
   a_child.partnumber, ' ',
   a_child.name), '')
   FROM
      article a_child
      left outer join bom on a_child.id = bom.child_article
   WHERE
      bom.parent_article = a.id
) myBOM
from article a

【讨论】:

  • 比你,@dmitry-reutov !我试过了,但也没有用。
  • 我试过得到这个结果 1 desc 4 times 0002 leg,1 times 0003 board 2 leg NULL 3 board NULL 有什么问题吗?
  • @FabianK,我编辑了任何答案,其中的查询会返回您想要的结果...请检查
  • 谢谢@dmitry-reutov!我已经应用了 INFULL 语句。然而,它在某些情况下仍然有效,而在其他情况下,它在我的实时数据中不起作用。这真的很奇怪,但正是那个部分导致了这个问题,因为当我把整个部分拿出来时,它工作得很好。我将更新我的问题,在环绕查询中提供一些进一步的细节 - 它是更大块的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多