如何创建GROUP BY SQL语句

时间:2019-06-18 13:12:30

标签: php mysql select group-by

我有一个包含多个订单的表,当一个订单状态更新时,它会创建一个新记录,因此1个订单可能由于状态不同而具有多个记录。

我有一个管理面板,管理员可以在其中显然看到所有订单,但是我不想为每个记录显示每个更新,因为这很容易失控。因此,我想获得每个订单的最新记录。因此,如果我有7条订单号为100的记录,我想显示订单号为100的最新更新。我希望每个订单都像这样。

我有一些在线阅读,试图了解MySQL Group By,因为我相信这是实现我想要的最好的方法,但是我似乎无法正常工作,我不断收到一条消息说我的SQL语句有错误

$query = '(SELECT * FROM orders 
           WHERE `order_status` != "Order Complete" 
           ORDER BY `order_update` DESC 
           GROUP BY `order_number`)'; 
$orderList = $conn->query($query);

这是我遇到的错误 您的SQL语法有误;请查看与您的MySQL服务器版本相对应的手册,以在'GROUP BY order_number

附近使用正确的语法

我应该提供我的列结构。因此,我有一个ID列,一个Order Number列,一个Order Status列,最后是一个Order Date列。因此,我确定最新状态的方法是采用“订购日期”(设置为时间戳)。

编辑 我想实现我提出的问题,但这是一个循环。我循环浏览并将其全部显示在一个表中,因此可能有100个不同的订单,这意味着100个不同的订单号,但是我只想显示每个订单的最新状态,我可以使用“订单日期”列来确定这些状态。我也在用PHP来构建/执行查询

3 个答案:

答案 0 :(得分:1)

首先,如上面的注释中所述,您对错误问题有一个答案,GROUP BY始终位于ORDER BY之前。

第二,您需要在列上提供更多数据吗?也许您有订单的时间和日期?您如何确定最新的顺序?

沿着这些思路怎么样

$query = '(SELECT DISTINCT id, order_number, order_status, MAX(order_date) 
           FROM orders 
           WHERE `order_status` != "Order Complete"  
           ORDER BY `order_update` DESC, MAX(order_date)'; 
$orderList = $conn->query($query);

只需将其编辑为不熟悉的PHP语法

答案 1 :(得分:0)

$query = '(SELECT * FROM orders 
           WHERE `order_status` != "Order Complete"           
           GROUP BY `order_number`
           HAVING `order_update`=MAX(`order_update`))';

答案 2 :(得分:0)

我显然不知道您要查找的内容的100%,但是您可能无需使用GROUP BY子句就可以实现此目的。通常,在使用聚合函数(GROUP BYCOUNT等时,通常只会使用SUM。这是说“嘿,我想要...的计数,总和等)的一种方式。这些特定的列。”

您的查询可能更接近:

SELECT *
FROM orders
WHERE order_status != 'Order Complete' -- Consider revising, maybe just a boolean?
    AND order_number = 100
ORDER BY order_update DESC
LIMIT 1;

根据您的DBMS,列名等,您的查询可能有很大不同。请随时发表评论,提供更多信息,我可以为您提供更多帮助:)

编辑:只是注意到您确实将MySQL列为DBMS。我的错。只需稍作调整,该查询就足够了。