通过查询分组的mysql总和需要特定的总和

时间:2017-12-20 18:11:32

标签: mysql

http://rextester.com/OZKM95674

中运行代码

我正在尝试一种快速简便的方法来获取项目的所有变体的数量总和,但也包括所有标签(逗号分隔)和项目的一个图像等数据(不要无关紧要)。有很多表格如下所示:

查询1:下面的查询获取我想要的数量数据,但缺少我的应用程序所需的数据(参见查询2)。

SELECT  phppos_items.item_id,
        phppos_items.name, 
        SUM(phppos_location_item_variations.quantity) as quantity
FROM `phppos_items`
LEFT JOIN `phppos_item_variations` 
       ON `phppos_item_variations`.`item_id` = `phppos_items`.`item_id` 
LEFT JOIN `phppos_location_item_variations` 
       ON `phppos_location_item_variations`.`item_variation_id` = `phppos_item_variations`.`id` 
      and `phppos_location_item_variations`.`location_id` = 1
GROUP BY `phppos_items`.`item_id`

结果:

+---------+------+----------+
| item_id | name | quantity |
+---------+------+----------+
|       1 | TEST |       10 |
+---------+------+----------+

查询2:但是在应用程序中,我实际上需要更多关于项目的数据,例如标签和一个图像(可能很多只需要一个)。我需要如下的确切输出,但不是数量是60我需要它像以前一样20。我知道发生这种情况的原因是因为当我分组时;因为有3个标签和1个图像,所以有多行。

SELECT  phppos_items.item_id, 
        phppos_items.name, SUM(phppos_location_item_variations.quantity) as quantity,
       `phppos_item_images`.`image_id` as `image_id`, 
        GROUP_CONCAT(DISTINCT phppos_tags.name) as tags
FROM `phppos_items`
LEFT JOIN `phppos_item_variations` 
       ON `phppos_item_variations`.`item_id` = `phppos_items`.`item_id` 
LEFT JOIN `phppos_location_item_variations` 
       ON `phppos_location_item_variations`.`item_variation_id` = `phppos_item_variations`.`id` 
      and `phppos_location_item_variations`.`location_id` = 1
LEFT JOIN `phppos_items_tags` 
       ON `phppos_items_tags`.`item_id` = `phppos_items`.`item_id` 
LEFT JOIN `phppos_tags` 
       ON `phppos_tags`.`id` = `phppos_items_tags`.`tag_id` 
LEFT JOIN `phppos_item_images` 
       ON `phppos_items`.`item_id` = `phppos_item_images`.`item_id` 
WHERE `phppos_items`.`deleted` = 0
  AND `phppos_items`.`system_item` = 0 
GROUP BY `phppos_items`.`item_id`


+---------+------+----------+----------+--------------------+
| item_id | name | quantity | image_id | tags               |
+---------+------+----------+----------+--------------------+
|       1 | TEST |       60 |        1 | test,test 2,test 3 |
+---------+------+----------+----------+--------------------+

在一个查询中获取所有这些数据的有效方法是什么?

示例数据:

phppos_items:
+---------+------+
| item_id | name |
+---------+------+
|       1 | TEST |
+---------+------+

phppos_item_variations:
+---------+----+
| item_id | id |
+---------+----+
|       1 |  1 |
+---------+----+

phppos_location_item_variations:
+-------------------+----------+
| item_variation_id | quantity |
+-------------------+----------+
|                 1 |       10 |
+-------------------+----------+

phppos_tags:
+--------+----+
| name   | id |
+--------+----+
| test   |  1 |
| test 2 |  2 |
| test 3 |  3 |
+--------+----+

phppos_items_tags:
+---------+--------+
| item_id | tag_id |
+---------+--------+
|       1 |      1 |
|       1 |      2 |
|       1 |      3 |
+---------+--------+

phppos_item_images:
+---------+----------+
| item_id | image_id |
+---------+----------+
|       1 |        1 |
|       1 |        4 |
+---------+----------+

涉及的表格

CREATE TABLE `phppos_items` (
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `item_id` int(10) NOT NULL AUTO_INCREMENT,
  `deleted` int(1) NOT NULL DEFAULT '0',
  `system_item` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`item_id`),
  UNIQUE KEY `item_number` (`item_number`),
  KEY `deleted` (`deleted`),
  KEY `deleted_system_item` (`deleted`,`system_item`),
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

CREATE TABLE `phppos_item_variations` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `item_id` int(10) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `phppos_item_variations_ibfk_1` (`item_id`),
  CONSTRAINT `phppos_item_variations_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `phppos_items` (`item_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

 CREATE TABLE `phppos_location_item_variations` (
  `item_variation_id` int(10) NOT NULL,
  `location_id` int(10) NOT NULL,
  `quantity` int(1) DEFAULT NULL,
  `reorder_level` decimal(23,10) DEFAULT NULL,
  `replenish_level` decimal(23,10) DEFAULT NULL,
  PRIMARY KEY (`item_variation_id`,`location_id`),
  KEY `phppos_item_attribute_location_values_ibfk_2` (`location_id`),
  CONSTRAINT `phppos_item_attribute_location_values_ibfk_1` FOREIGN KEY (`item_variation_id`) REFERENCES `phppos_item_variations` (`id`),
  CONSTRAINT `phppos_item_attribute_location_values_ibfk_2` FOREIGN KEY (`location_id`) REFERENCES `phppos_locations` (`location_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

CREATE TABLE `phppos_items_tags` (
  `item_id` int(11) NOT NULL,
  `tag_id` int(11) NOT NULL,
  PRIMARY KEY (`item_id`,`tag_id`),
  KEY `phppos_items_tags_ibfk_2` (`tag_id`),
  CONSTRAINT `phppos_items_tags_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `phppos_items` (`item_id`),
  CONSTRAINT `phppos_items_tags_ibfk_2` FOREIGN KEY (`tag_id`) REFERENCES `phppos_tags` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |


CREATE TABLE `phppos_tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ecommerce_tag_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `deleted` int(1) NOT NULL DEFAULT '0',
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `tag_name` (`name`),
  KEY `deleted` (`deleted`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

CREATE TABLE `phppos_item_images` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `alt_text` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `item_id` int(11) DEFAULT NULL,
  `item_variation_id` int(10) DEFAULT NULL,
  `ecommerce_image_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `image_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `phppos_item_images_ibfk_1` (`item_id`),
  KEY `phppos_item_images_ibfk_2` (`image_id`),
  KEY `phppos_item_images_ibfk_3` (`item_variation_id`),
  CONSTRAINT `phppos_item_images_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `phppos_items` (`item_id`),
  CONSTRAINT `phppos_item_images_ibfk_2` FOREIGN KEY (`image_id`) REFERENCES `phppos_app_files` (`file_id`),
  CONSTRAINT `phppos_item_images_ibfk_3` FOREIGN KEY (`item_variation_id`) REFERENCES `phppos_item_variations` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

1 个答案:

答案 0 :(得分:1)

您说您的第一个查询已经有效,所以现在您需要获取剩余信息

<强> SQL DEMO

Sub NotWorking()

   Dim src As Range
   Dim dst As Range

   Set src = Range("C3")
   Set dst = Range("E3")

   If src.Value = 0 Then
       dst.Formula = "=0.6 * 7"
   Else
       dst.Value = 1.2
   End If

End Sub

输出

enter image description here