Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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 - Fatal编程技术网

Mysql 组合三个(复杂)查询

Mysql 组合三个(复杂)查询,mysql,Mysql,我有一个查询,我用它来汇总库存总额,并显示每个库存项目的最后更新日期。我有两种不同的库存类型0和1(传入和传出)。我想能够在页面底部写上“上次收到的库存在:&”上次装运在:“ 以下是我的主要查询内容,用于对库存进行分组和汇总: $query = "Select * FROM (SELECT id, type, color, product, SUM(Quantity) AS TotalQuantity, MAX(Date) A

我有一个查询,我用它来汇总库存总额,并显示每个库存项目的最后更新日期。我有两种不同的库存类型0和1(传入和传出)。我想能够在页面底部写上“上次收到的库存在:&”上次装运在:“

以下是我的主要查询内容,用于对库存进行分组和汇总:

 $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的库存中选择最大值(日期)有什么复杂的地方如果它是三个选择最大(日期),我可能会找到它。