Mysql 组合三个(复杂)查询
我有一个查询,我用它来汇总库存总额,并显示每个库存项目的最后更新日期。我有两种不同的库存类型0和1(传入和传出)。我想能够在页面底部写上“上次收到的库存在:&”上次装运在:“ 以下是我的主要查询内容,用于对库存进行分组和汇总:Mysql 组合三个(复杂)查询,mysql,Mysql,我有一个查询,我用它来汇总库存总额,并显示每个库存项目的最后更新日期。我有两种不同的库存类型0和1(传入和传出)。我想能够在页面底部写上“上次收到的库存在:&”上次装运在:“ 以下是我的主要查询内容,用于对库存进行分组和汇总: $query = "Select * FROM (SELECT id, type, color, product, SUM(Quantity) AS TotalQuantity, MAX(Date) A
$query = "Select *
FROM (SELECT id, type, color, product,
SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate
FROM inventory
GROUP BY id, color, type) AS alias
WHERE TotalQuantity > 0";
现在,我还希望能够运行这两个查询,以获取“stock”0和1(传入、传出)的上次更新时间
结合这三个查询有什么帮助吗?我试着结合,但运气不太好。试试这样:
SELECT alias.*,
zeroStock.zeroDate,
nonzeroStock.nonzeroDate
FROM
(
SELECT id,
type,
color,
product,
SUM(Quantity) AS TotalQuantity,
MAX(Date) AS LatestDate
FROM inventory
GROUP BY id, color, type
) alias INNER JOIN
(
SELECT id, MAX(Date) zeroDate
FROM inventory
WHERE stock = 0
GROUP BY id
) zeroStock on alias.id = zeroStock.id
INNER JOIN
(
SELECT id, MAX(Date) nonzeroDate
FROM inventory
WHERE stock = 1
GROUP BY id
) nonzeroStock on alias.id = nonzeroStock.id
WHERE alias.TotalQuantity > 0
试着这样做:
SELECT alias.*,
zeroStock.zeroDate,
nonzeroStock.nonzeroDate
FROM
(
SELECT id,
type,
color,
product,
SUM(Quantity) AS TotalQuantity,
MAX(Date) AS LatestDate
FROM inventory
GROUP BY id, color, type
) alias INNER JOIN
(
SELECT id, MAX(Date) zeroDate
FROM inventory
WHERE stock = 0
GROUP BY id
) zeroStock on alias.id = zeroStock.id
INNER JOIN
(
SELECT id, MAX(Date) nonzeroDate
FROM inventory
WHERE stock = 1
GROUP BY id
) nonzeroStock on alias.id = nonzeroStock.id
WHERE alias.TotalQuantity > 0
您可以使用
交叉联接
将日期添加到常规select语句的每一行
SELECT *
FROM (
SELECT *
FROM (
SELECT id, type, color, product, SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate
FROM inventory
GROUP BY
id, color, type
) AS alias
WHERE TotalQuantity > 0
) AS q
CROSS JOIN (SELECT MAX(Date) AS MaxIncoming FROM Inventory WHERE stock = 0) AS r
CROSS JOIN (SELECT MAX(Date) AS MaxOutgoing FROM Inventory WHERE stock = 1) AS s
交叉连接也称为笛卡尔积连接。交叉连接
SQL返回一个结果表,其中第一个表中的每一行
与第二个表中的每一行合并
编辑
对于记录,您可以使用HAVING
子句而不是TotalQuantity上的WHERE
子句来简化语句
SELECT *
FROM (
SELECT id, type, color, product, SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate
FROM inventory
GROUP BY
id, color, type
HAVING
SUM(Quantity) > 0
) AS q
CROSS JOIN (SELECT MAX(Date) AS MaxIncoming FROM Inventory WHERE stock = 0) AS r
CROSS JOIN (SELECT MAX(Date) AS MaxOutgoing FROM Inventory WHERE stock = 1) AS s
您可以使用
交叉联接
将日期添加到常规select语句的每一行
SELECT *
FROM (
SELECT *
FROM (
SELECT id, type, color, product, SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate
FROM inventory
GROUP BY
id, color, type
) AS alias
WHERE TotalQuantity > 0
) AS q
CROSS JOIN (SELECT MAX(Date) AS MaxIncoming FROM Inventory WHERE stock = 0) AS r
CROSS JOIN (SELECT MAX(Date) AS MaxOutgoing FROM Inventory WHERE stock = 1) AS s
交叉连接也称为笛卡尔积连接。交叉连接
SQL返回一个结果表,其中第一个表中的每一行
与第二个表中的每一行合并
编辑
对于记录,您可以使用HAVING
子句而不是TotalQuantity上的WHERE
子句来简化语句
SELECT *
FROM (
SELECT id, type, color, product, SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate
FROM inventory
GROUP BY
id, color, type
HAVING
SUM(Quantity) > 0
) AS q
CROSS JOIN (SELECT MAX(Date) AS MaxIncoming FROM Inventory WHERE stock = 0) AS r
CROSS JOIN (SELECT MAX(Date) AS MaxOutgoing FROM Inventory WHERE stock = 1) AS s
试试这个
Select
alias.id,
alias.type,
alias.color,
alias.product,
Stock0.S0,
Stock1.S1
FROM (SELECT
id,
type,
color,
product,
SUM(Quantity) AS TotalQuantity,
MAX(Date) AS LatestDate
FROM inventory
GROUP BY id, color, type) AS alias
left join (SELECT
id,
MAX(Date) S0
FROM inventory
WHERE stock = 0) as Stock0
on Stock0.id = alias.id
left join (SELECT
id,
MAX(Date) S1
FROM inventory
WHERE stock = 0) as Stock1
on Stock1.id = alias.id
WHERE TotalQuantity > 0
试试这个
Select
alias.id,
alias.type,
alias.color,
alias.product,
Stock0.S0,
Stock1.S1
FROM (SELECT
id,
type,
color,
product,
SUM(Quantity) AS TotalQuantity,
MAX(Date) AS LatestDate
FROM inventory
GROUP BY id, color, type) AS alias
left join (SELECT
id,
MAX(Date) S0
FROM inventory
WHERE stock = 0) as Stock0
on Stock0.id = alias.id
left join (SELECT
id,
MAX(Date) S1
FROM inventory
WHERE stock = 0) as Stock1
on Stock1.id = alias.id
WHERE TotalQuantity > 0
最好将查询2和查询3与查询1分开运行。查询2和查询3与查询1是一个独立的关注点,因为您希望获得单独的值,而不是多列列表。此外,您正在筛选查询1中的结果,而不是查询2和查询3中的结果 当然,您可以对子查询进行两次
交叉连接,但这样一来,您将在数据库和应用程序之间传输更多不必要的数据。您只需要检索两个值,而不是两整列(我可能会添加这两列,它们与结果集的其余部分无关——进一步强调了它们的不一致性)
此外,交叉连接方法假设至少有一行满足和(数量)>0的条件。如果他们都不满意呢。。。那么您也不会有最新的进货/出货日期!尽管可能不太可能,但必须考虑这个用例
话虽如此,您可以重写第一个查询以避免子选择:
SELECT
id,
color,
type,
product,
SUM(Quantity) AS TotalQuantity,
MAX(Date) AS LatestDate
FROM
inventory
GROUP BY
id,
color,
type
HAVING
SUM(Quantity) > 0
您可以在聚合函数MAX()
中使用条件检查组合查询2和查询3:
最好将查询2和查询3与查询1分开运行。查询2和查询3与查询1是一个独立的关注点,因为您希望获得单独的值,而不是多列列表。此外,您正在筛选查询1中的结果,而不是查询2和查询3中的结果
当然,您可以对子查询进行两次交叉连接,但这样一来,您将在数据库和应用程序之间传输更多不必要的数据。您只需要检索两个值,而不是两整列(我可能会添加这两列,它们与结果集的其余部分无关——进一步强调了它们的不一致性)
此外,交叉连接方法假设至少有一行满足和(数量)>0的条件。如果他们都不满意呢。。。那么您也不会有最新的进货/出货日期!尽管可能不太可能,但必须考虑这个用例
话虽如此,您可以重写第一个查询以避免子选择:
SELECT
id,
color,
type,
product,
SUM(Quantity) AS TotalQuantity,
MAX(Date) AS LatestDate
FROM
inventory
GROUP BY
id,
color,
type
HAVING
SUM(Quantity) > 0
您可以在聚合函数MAX()
中使用条件检查组合查询2和查询3:
看起来很有希望,但我得到了一个错误:…使用near'选择MAX(Date)作为maxOuting FROM inventory WHERE stock=1)作为r'@mcflause-My bad的语法。我已经更改了声明。你能验证一下吗?看起来很有希望,但我得到了一个错误:…使用near'选择MAX(Date)作为maxOuting FROM inventory WHERE stock=1)作为r'@mcflause-My bad的语法。我已经更改了声明。您能验证一下吗?很抱歉,从库存中选择MAX(Date),其中stock=0
?@Seph是最复杂的;)如果是三个选择最大值(日期),我可能会想出来。对不起,从库存=0的库存中选择最大值(日期)有什么复杂的地方如果它是三个选择最大(日期),我可能会找到它。