在MySQL5.7中使用`max()`和`group by`

cnwbcb6i  于 2021-06-25  发布在  Mysql
关注(0)|答案(3)|浏览(358)

MySQL 5.7 ,我有以下几点 orders 以及 transactions 各表。我想得到最大值 transaction.timestamp 每种产品 orders.status 是“完成”。

我使用了以下查询:

SELECT 
    MAX(timestamp), 
    product, 
    idorder, 
    idtransaction,
    order_name 
FROM 
    transaction left join orders 
ON 
    transaction.order_id=orders.idorder 
WHERE
    status='done' 
GROUP BY
    'product';

但它导致了如下错误:
错误代码:1055。select list的表达式#2不在group by子句中,它包含未聚合的列“openbankŠu approvedb.transaction.product”,该列在功能上不依赖于group by子句中的列;这与sql\u mode=only\u full\u group by不兼容
我理解这里的问题,sql是无法理解的 GROUP BY 因为有多个类别。如何编写它,以便它返回与每个产品的最大时间戳记录相关的详细信息?

qq24tv8q

qq24tv8q1#

我想你想要:

SELECT t.product, MAX(timestamp)
FROM transaction t join
     orders o
    ON t.order_id = o.idorder 
WHERE o.status = 'done' 
GROUP BY t.product;

笔记:
据推测,所有事务的顺序都是有效的,因此不需要外部联接。
限定所有列名,以便查询明确无误。
不要在列名周围加单引号。仅对字符串和日期常量使用单引号。
这不包括交易和订单的ID。这样的id对于返回产品信息的查询没有意义。
编辑:
我突然想到,你想完整的交易信息,为最近的交易,为每个产品是“完成”。如果是这样,我将使用一个相关子查询:

SELECT t.*
FROM transaction t 
WHERE t.timestamp = (SELECT MAX(t2.timestamp)
                     FROM transaction t2 JOIN
                          orders o2
                          ON t2.order_id = o2.idorder 
                     WHERE o2.status = 'done' AND t2.product = t.product
                    );
quhf5bfb

quhf5bfb2#

您可以通过一个简单的技巧使用相同的查询。在MySQL5.7的默认sql模式下,您可以使用任何\u值来绕过该错误。

SELECT 
  MAX(timestamp), 
  product, 
  ANY_VALUE(idorder),
  ANY_VALUE(idtransaction) 
FROM 
  transaction left join orders 
ON 
  transaction.order_id=orders.idorder 
WHERE
  status='done' 
GROUP BY
  'product';

查看文档以详细了解为什么这里需要任何\u值https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-价值观。

jdzmm42g

jdzmm42g3#

select * from ( SELECT 
        MAX(timestamp)timestamp, 
        product
    FROM 
        transaction left join orders 
    ON 
        transaction.order_id=orders.idorder 
    WHERE
        status='done' 
    GROUP BY
        product ) a
   join 

  (SELECT 
        *
    FROM 
        transaction left join orders 
    ON 
        transaction.order_id=orders.idorder 
    WHERE
        status='done' 
 )b on a.timestamp=b.timestamp and a.product=b.product

相关问题