MySQL Query LEFT JOIN, SUM()



我有两个表:Inventory和InventoryTypes。Inventory有一列表示可用项目的数量,还有一列表示外键类型ID(此处不需要其他类型(。InventoryTypes有一列用于class(即库存类型的进一步分类(、typeName、description和typeID主键。

我想对按typeID分组的可用列求和,然后在typeID相等的InventoryTypes表中加入

我设法创建了最初的SQL语句,它起作用:

SELECT typeID, SUM(available) AS NumberofInventoryPerType FROM Inventory GROUP BY typeID;

当我尝试对InventoryTypes表使用LEFT JOIN时,如下所示:

SELECT typeID, SUM(available) AS NumberofInventoryPerType FROM Inventory GROUP BY typeID
LEFT JOIN (InventoryTypes ON Inventory.typeID = InventoryTypes.typeID ORDER BY InventoryTypes.descr);

样本数据:

库存表:

发票ID-可用-类型ID

1-10-1

2-15-2

3-10-1

InventoryTypes表:

typeID-class-typeName-descr

1-包装-盒-10x10盒

2-工具-移液管-0.1ml移液管

然后查询应该返回:

typeID-class-typeName-descr-InventoryPerType编号

1-包装-盒子-10x10盒子-20

2-工具-移液管-0.1ml移液管-15

查询未执行,并指示LEFT JOIN附近有错误。我只找到了初始选择查询没有GROUP BY子句的示例。这就是我的错误所在吗?感谢提供的任何帮助

SQL查询的一般结构是(注意,除了SELECT之外,所有部分都是可选的(:

SELECT columns
FROM block_of_data_like_a_table_or_query
JOIN another_block_of_data_like_a_table_or_query
JOIN a_third_block_of_data_like_a_table_or_query
WHERE conditions
GROUP BY columns
ORDER BY columns

你不能把你的[左]加入放在一个群组之后;你必须把它放在FROM区域

如果您想执行分组,然后将其加入其他表,则可以将其分组为子查询:

SELECT columns
FROM table
JOIN (SELECT columns FROM table JOIN table WHERE conditions GROUP BY columns) ON ...
WHERE conditions
GROUP BY columns
ORDER BY columns

因此,SQL必须如何结构化的总体规则得以保留;表是数据块,查询也是(产生(数据块。数据块必须连接到FROM区域中。

在您的特定情况下,将分组作为子查询,然后加入结果:

SELECT *
FROM 
(SELECT typeID, SUM(available) AS NumberofInventoryPerType FROM Inventory GROUP BY typeID) sumup
LEFT JOIN
InventoryTypes it
ON sumup.typeID = it.typeID
ORDER BY it.descr

我认为您不应该将Group ByLEFT JOIN混合:

以下是LEFT JOIN的示例:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;

尝试将结果分组到一个额外的查询中。使用INTO Param保存第一个查询的结果!

另请参见此处

形式化地(甚至没有试图理解查询的含义(

SELECT Inventory.typeID, SUM(Inventory.available) AS NumberofInventoryPerType 
FROM Inventory 
LEFT JOIN InventoryTypes ON Inventory.typeID = InventoryTypes.typeID
GROUP BY Inventory.typeID
ORDER BY ANY_VALUE(InventoryTypes.descr);

我建议:

SELECT it.typeID, SUM(i.available) AS NumberofInventoryPerType
FROM InventoryTypes it LEFT JOIN
Inventory i
ON it.typeID = i.typeID
ORDER BY MAX(it.descr);

注:

  • 如果您想要所有库存类型,它应该是LEFT JOIN中的第一个表
  • 使用表别名使查询更易于编写和读取

最新更新