Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何获得与分组结果集联接的关系表的和?_Mysql_Join_Subquery_Union - Fatal编程技术网

Mysql 如何获得与分组结果集联接的关系表的和?

Mysql 如何获得与分组结果集联接的关系表的和?,mysql,join,subquery,union,Mysql,Join,Subquery,Union,以下查询可用于获取为所有产品设置的库存警报数量: SELECT `product_id`, COUNT(`alert_stock_id`) AS `qty_alert` FROM `product_alert_stock` GROUP BY `product_id` 对于可配置产品(具有子产品的产品),如何在一个查询中获得其子产品和自身产品的总和 因此,如果一个产品在catalog\u product\u super\u link中有子产品,则应从product\u alert\u sto

以下查询可用于获取为所有产品设置的库存警报数量:

SELECT `product_id`, COUNT(`alert_stock_id`) AS `qty_alert` 
FROM `product_alert_stock` 
GROUP BY `product_id`
对于可配置产品(具有子产品的产品),如何在一个查询中获得其子产品和自身产品的总和

因此,如果一个产品在
catalog\u product\u super\u link
中有子产品,则应从
product\u alert\u stock
中检索所有
product\u id
的计数,并将其添加到父产品的计数中

catalog\u product\u super\u链接中的示例数据

+---------+------------+-----------+
| link_id | product_id | parent_id |
+---------+------------+-----------+
|    1    |          2 |         1 |
|    2    |          3 |         1 |
|    3    |          4 |         1 |
+---------+------------+-----------+
前面提供的查询的示例结果集:

  • ID 1:0库存警报
  • ID 2:5库存警报
  • ID 3:2库存警报
  • ID 4:2库存警报
所需的结果集应为:

+------------+-----------+
| product_id | qty_alert |
+------------+-----------+
|          1 |         9 | # 0 + 5 + 2 + 2
|          2 |         5 |
|          3 |         2 |
|          4 |         2 |
+------------+-----------+
这可能是一个简单的联接或子查询问题,但我无法在一个具有未识别数据集(即没有产品ID筛选器)的查询中解决它

2015年9月14日编辑//进一步澄清
product\u alert\u stock
中可能没有任何结果,则
qty\u alert
为0

此查询应在子查询(
JOIN
)中使用:

尝试将下面的给定答案拟合到子查询中,但未生成正确的结果集,请参见答案下面的注释


注:若有人想知道,这些表格来自Magento。

若产品的折叠级别为1,那个么问题就相当简单了。您需要嵌套查询(抱歉,现在无法访问mysql进行检查)


若产品的折叠级别为1,那个么问题就相当简单了。您需要嵌套查询(抱歉,现在无法访问mysql进行检查)


假设是单级父/子关系,则可以使用左外部联接:-

SELECT t1.product_id, COUNT(DISTINCT t1.alert_stock_id) + COUNT(t3.alert_stock_id) AS qty_alert 
FROM product_alert_stock t1
LEFT OUTER JOIN catalog_product_super_link t2
ON t1.product_id = t2.parent_id
LEFT OUTER JOIN product_alert_stock t3
ON t2.product_id = t3.product_id
GROUP BY t1.product_id

这将统计父级的不同库存ID,以及子级的所有库存ID。

假设是单级父/子关系,则可以使用左外联接:-

SELECT t1.product_id, COUNT(DISTINCT t1.alert_stock_id) + COUNT(t3.alert_stock_id) AS qty_alert 
FROM product_alert_stock t1
LEFT OUTER JOIN catalog_product_super_link t2
ON t1.product_id = t2.parent_id
LEFT OUTER JOIN product_alert_stock t3
ON t2.product_id = t3.product_id
GROUP BY t1.product_id

这将统计父项的不同股票ID,以及子项的所有股票ID。

您可以使用left join函数组合这两个股票ID

SELECT  `product_id`,
         COUNT(`alert_stock_id`) + COALESCE(alert,0) AS `qty_alert` 
FROM    `product_alert_stock` T1 
         LEFT OUTER JOIN 
         (
            SELECT   parent_id,count(1) `alert` 
            FROM     catalog_product_super_link 
            GROUP BY parent_id 
          )T2 
            ON T1.product_id = T2.parent_id
GROUP BY `product_id`;

您可以使用left join函数组合两个答案

SELECT  `product_id`,
         COUNT(`alert_stock_id`) + COALESCE(alert,0) AS `qty_alert` 
FROM    `product_alert_stock` T1 
         LEFT OUTER JOIN 
         (
            SELECT   parent_id,count(1) `alert` 
            FROM     catalog_product_super_link 
            GROUP BY parent_id 
          )T2 
            ON T1.product_id = T2.parent_id
GROUP BY `product_id`;


你有0522。这是0表示父级,其余表示其子级吗?还有,这种组合是如何产生的?甚至是有意义的(9)?MySQL对递归过程的支持非常有限,对递归函数没有任何支持;因此,它不太适合处理以邻接列表格式存储的层次化数据(如此)。您最好以不同的方式对数据建模,例如使用嵌套集或可传递闭包表。有关详细信息,请参阅。是,0表示父级,其余表示子级。这些数据是有意义的,因为父产品是基础产品,可能会出售,也可能不会出售。有关变化总和的库存警报(基础产品的子产品,例如M、S、XL)可以帮助指示产品的受欢迎程度。您有0 5 2 2。这是0表示父级,其余表示其子级吗?还有,这种组合是如何产生的?甚至是有意义的(9)?MySQL对递归过程的支持非常有限,对递归函数没有任何支持;因此,它不太适合处理以邻接列表格式存储的层次化数据(如此)。您最好以不同的方式对数据建模,例如使用嵌套集或可传递闭包表。有关详细信息,请参阅。是,0表示父级,其余表示子级。这些数据是有意义的,因为父产品是基础产品,可能会出售,也可能不会出售,股票会提醒变化的总和(基础产品的子产品,例如M、S、XL)可以帮助说明一个产品的流行程度。请考虑编辑您的帖子,以添加更多关于您的代码所做的解释以及为什么它会解决问题的解释。大多数情况下只包含代码的答案(即使有效)通常不会帮助OP了解他们的问题。是的,现在看起来更好似乎不会返回不在
product\u alert\u stock
中的行的结果。从问题的例子看,产品TytID=1在<代码>产品TytTyAtReTyStRoSt/<代码中没有任何行。在仔细检查之后,查询不能正确,因为它对<代码> CordAsLogTuffTySuffiLink 中的行进行计数。请考虑编辑您的帖子,以添加更多关于您的代码所做的解释以及为什么它将解决该问题的解释。大多数情况下只包含代码的答案(即使有效)通常不会帮助OP了解他们的问题。是的,现在看起来更好似乎不会返回不在
product\u alert\u stock
中的行的结果。从问题中的示例来看,product_id=1在
product_alert_stock
中没有任何行。仔细检查后,查询无法正确,因为它在
catalog\u product\u super\u link
中计算行数。由于使用了DISTINCT,如果有多个集合(不是节点,只是一个级别),此查询将失败唯一的父-子项。你能在sql FIDLE上举个例子吗?由于使用了DISTINCT,如果有多个唯一的父-子项集(不是节点,它只是一个级别),此查询将失败。你能在sql FIDLE上举个例子吗?